变量与数据类型
如果我们想去描述一个人,可以用一些特征去描述,比如,姓名:张三,年龄:20,身高:175.5。这里面的姓名、年龄、身高就相当于是变量。
变量,直观的理解就是可以变化的量。这个人的姓名叫张三,另一个人的姓名可以叫李四。专业点理解,变量本质上是内存地址的“标签”,这避免了直接操作内存地质的复杂性,让编程变得简单起来。
那么在Python中我们就可以这么写变量和对应的值:
姓名 = '张三'年龄 = 20身高 = 175.5
=的左边就是变量,右边就是存储的数据。用中文作为变量也是符合语法规则的,但在实际开发中我们一般用英文字符来表示变量,这样能够避免一些不必要的麻烦,所以我们会这样定义变量:
name = '张三'age = 20height = 175.5
描述张三的姓名、年龄、身高的数据你会发现它们的分类是不一样的,比如姓名是一种字符,年龄是一个整数,而身高是带有小数的,数据类型其实就是对数据的一种分类,数据类型说明了数据的本质特征,也定义了它可以进行哪些操作。
Python中的数据类型简单来说可以分为内置类型和用户自定义类型,下面列一下常见的内置类型。
| | |
|---|
| | |
| | |
| | |
| | 由实部和虚部组成,如1+2j,虚部用 j或 J标记 |
| | 字符序列,用单引号、双引号或三引号包裹,如:'Python','hello, world' |
| | 可变元素列表,元素可重复,类型可混合,如:[1,2,'a'] |
| | |
| | 整数序列生成器,如 range(5) 表示 0-4 的整数范围 |
| | 键值对集合,键唯一且不可变,如:{"name": "张三", "age": 20} |
| | |
| | 不可变集合,元素一旦定义无法修改,如 :frozenset({1, 2, 3}) |
| | 不可变二进制数据,如:b"abc", bytes([65, 66]) |
| | 可变二进制数据,类似 bytes,但支持修改,如:bytearray(b'abc') |
| | |
| | |
了解了Python的数据类型之后,我们可以尝试定义一些不同类型的变量。
age = 20 # 整数height = 175.5 # 浮点数has_money = False # 布尔值name = 'Python' # 字符串a_list = [1, 2, 'a'] # 列表
在Python中有一个type()函数可以用来查看变量或数据的类型。示例如下:
name = '张三'print(type(name)) # 输出:<class 'str'>age = 20print(type(age)) # 输出:<class 'int'>height = 175.5print(type(height)) # 输出:<class 'float'>print(type(True)) # 输出:<class 'bool'>print(type(1)) # 输出:<class 'int'>a = [1,2,3]print(type(a)) # 输出:<class 'list'>b= (1, 2, 3)print(type(b)) # 输出:<class 'tuple'>
变量命名规则
Python中变量的命名非常简单,但也需要遵守一定的规则,有一些是硬性规则,不遵守则会出现语法错误,有一些是软性规则,让代码更易阅读和维护。
硬性规则:
- • 变量名必须以字母(a-z,A-Z)或下划线(_)开头,不能以数字开头。示例:name(合法),123name(非法)
- • 变量中不能包含空格或特殊字符。特殊字符如 @, $, %, &, -, ! 等。注意,连字符(-)也是不允许的。示例:my name(非法),my@name(非法)
- • 不能使用Python关键字。如:if = 20
可以通过下面的代码来查看Python中的关键字:
import keywordprint(keyword.kwlist)
软性规则:
- • 推荐使用蛇形命名法,即全小写,多个单词用下划线连接,这是Python社区的主流风格。而且变量名最好做到见名知意。示例:student_name
- • 下划线有特殊的用法。单下划线(_)约定为模块/类的内部变量,是一种弱私有。双下划线(__)会触发 Python 的 “名称修饰” 机制,是一种强私有,在类的外部更难被访问。双下划线开头和结尾,是特殊方法,如
__init__ - • 不使用内置的函数名。避免使用Python中内置的函数作为变量名,如:list,str,print,否则会覆盖内置函数的功能。
更完整的代码规范可以参考官方的PEP 8(https://peps.python.org/pep-0008/)
当然我们不用去记忆这些繁琐的规则,因为有更好的方法去帮助我们去培养良好的编码习惯,比如安装一些代码检查插件,如:Pylint、Flake8、Black Formatter等
运算符
运算符是用来执行各种数学、逻辑、比较等操作的特殊符号,在Python中主要包括:算术运算符,赋值运算符,比较运算符,逻辑运算符,位运算符,成员运算符,身份运算符,三元条件运算符。下面进行具体的说明。
• 比较运算符,用于比较两个值,返回的结果是布尔值。逻辑与:两边都为True,结果才是True。逻辑或:至少一边为True,结果才为True。逻辑非:取反。
非零数值、非空序列视为True。零、None、空序列视为False。
利用这样的特性,我们看一些有意思的事情。
print(1 and 2) # 输出为2print(0 and 2) # 输出为0
这样的输出因为and是一种短路逻辑,也就是遇到一个False的值就直接返回,不在继续判断后面的表达式了,如果两个表达式都为True,那么就返回最后一个表达式的值。这里的1和2都是非零数值,所以认为是True,也就返回了最后一个值2,而0和2中,0人为是False,也就不进行后面表达式的判断了,就直接返回了0。
• 位运算符,对整数的二进制位进行操作。这属于底层操作,开发中一般很少用,一旦需要用的时候,就是进行高效操作的时候。• 成员运算符,用于检查元素是否在序列(字符串、列表、元组、字典等)中,返回布尔值。下面看一个具体的例子:
s = 'abc's1 = 'a'print(s1 in s) # 输出Truex = 1y = (2,3,4)print(x not in y) # 输出True
• 身份运算符,比较两个对象是否为同一个对象(内存地址),返回布尔值。下面看一个具体的例子:
a = [1,2,3]b = aprint(a is b) # 输出Trueprint(a is not b) # 输出False
• 三元条件运算符,也称为条件表达式,是一种简洁的判断语法。语法:x if condition else y。根据condition的真假返回x或y。下面看一个选择两个数中较大的值的例子:
x = 1y = 2max = x if x > y else yprint(max)
类型转换
类型转换是指将一种数据类型转换为另一种数据类型。在一些场景下非常常见,比如实际需要的输入是一个数字,而用户输入的是一个字符串,这就需要将字符串转换为数字。Python中类型转换分为两种,一种是隐式转换,一种是显示转换。
隐式转换是自动转换,通常是将窄类型转换为宽类型,比如整数类型转换为浮点类型。
x = 1y = 1.1z = x + y # x会自动转换为float类型print(z, type(z)) # 输出:2.1 <class 'float'>
显示转换,也称强制类型转换,需要手动进行,Python中内置了一些用于显示转换的函数。
| | |
|---|
| | int('10') -> 10,int(1.2) -> 1 |
| | float('3.1415926') -> 3.1415926 |
| | |
| | |
| | list('abc') -> ['a', 'b', 'c'] |
| | tuple('abc') -> ('a', 'b', 'c') |
| | |
| | dict([('a', 1), ('b', 2)]) -> {'a': 1, 'b': 2} |
代码规范
遵循代码规范能够提升代码的可读性、可维护性和一致性。我们上面提到过的PEP 8是得到广泛认可的规范,还有一个是PEP 20,它是一份简洁的Python设计哲学指南,可以通过运行import this这条简单的语句来查看。更多的情况下我们可以使用工具来辅助我们检查代码和格式化代码,如Pylint、Flake8、Black Formatter等。除了这些,这部分想着重提到的是缩进和注释。
• 缩进虽然Tab和空格都能表达缩进,而且Tab只需要点击一下,但是更建议是4个空格作为缩进,因为空格是强一致性的,而Tab在不同的环境下是不固定的。避免空格和Tab混用。每行代码长度不超过79个字符,超长时可以换行。• 注释注释是为了给代码提示解释和说明,写注释是应该解释“为什么”而不是“做什么”,注释也要随着代码的修改做必要的更新。Python中有单行注释和文档字符串,单行注释以#开头,文档字符串用三个引号('''或""")开头。示例如下:x = 10 # 这是单行注释示例def add(a, b): """ 计算两个数的和 """ return a + b
上面的代码我们用到了函数,在后面的章节会进行详细的介绍,这里先简单介绍一下Python中函数定义的语法:
def 函数名(参数列表): """函数文档字符串(可选,用于说明函数功能)""" 函数体(实现功能的代码) return 返回值(可选)
本章练习
至此,这一章的主要内容就写完了,我们来做一个练习:编写一个“简易计算器”,实现两个数字的加减乘除运算,并输出带注释的结果。