Python变量的定义和使用
变量保存的数据可以被多次修改,而常量一旦保存某个数据之后就不能修改了。
Python变量的赋值
将数据放入变量的过程叫做赋值(Assignment)。Python使用等号=作为赋值运算符,具体格式为:
name = value
name表示变量名;value表示值,也就是要存储的数据。注意,变量是标识符的一种,它的名字不能随便起,要遵守Python标识符命名规范,还要避免和Python内置函数以及Python保留字重名。
Python变量的使用
使用 Python 变量时,只要知道变量的名字即可。几乎在Python代码的任何地方都能使用变量。
>>> print(n) #将变量传递给函数
10
>>> m = n * 10 + 5 #将变量作为四则运算的一部分
>>> print(m)
105
>>> print(m-30) #将由变量构成的表达式作为参数传递给函数
75
>>> m = m * 2 #将变量本身的值翻倍
>>> print(m)
210
Python是弱类型的语言
C语言、C++、Java 是强类型语言的代表。和强类型语言相对应的是弱类型语言,Python、JavaScript、PHP 等脚本语言一般都是弱类型的。
弱类型语言有两个特点:
- 变量无须声明就可以直接赋值,对一个不存在的变量赋值就相当于定义了一个新变量。
- 变量的数据类型可以随时改变,比如,同一个变量可以一会儿被赋值为整数,一会儿被赋值为字符串。
Python整数类型(int)详解
整数就是没有小数部分的数字,Python中的整数包括正整数、0和负整数。
有些强类型的编程语言会提供多种整数类型,每种类型的长度都不同,能容纳的整数的大小也不同,开发者要根据实际数字的大小选用不同的类型。例如C语言提供了short、int、long、long long四种类型的整数,它们的长度依次递增,初学者在选择整数类型时往往比较迷惑,有时候还会导致数值溢出。
而Python则不同,它的整数不分类型,或者说它只有一种类型的整数。Python整数的取值范围是无限的,不管多大或者多小的数字,Python 都能轻松处理。
当所用数值超过计算机自身的计算能力时,Python 会自动转用高精度计算(大数计算)。
整数的不同进制
Python小数/浮点数(float)类型详解
小数通常以浮点数的形式存储。浮点数和定点数是相对的:小数在存储过程中如果小数点发生移动,就称为浮点数;如果小数点不动,就称为定点数。Python中的小数有两种书写形式:
- 十进制形式:平时看到的小数形式,例如 34.6、346.0、0.346。书写小数时必须包含一个小数点,否则会被Python当作整数处理。
- 指数形式:小数的指数形式为aEn或aen,a为尾数部分,是一个十进制数;n为指数部分,是一个十进制整数;E或e是固定的字符,用于分割尾数部分和指数部分。整个表达式等价于$a×10^{n}$。举例:2.1E5=2.1×105,其中2.1是尾数,5是指数。3.7E-2 = 3.7×10-2,其中3.7是尾数,-2是指数。0.5E7=0.5×107,其中 0.5是尾数,7是指数。
Python 只有一种小数类型,就是 float。C语言有两种小数类型,分别是 float 和 double:float 能容纳的小数范围比较小,double 能容纳的小数范围比较大。
>> f1 = 12.5 >> print('f1Value:', f1) f1Value: 12.5 >> print('f1Type:', type(f1)) f1Type:>> f5 = 12e4 >> print("f5Value: ", f5) f5Value: 120000.0 >> print("f5Type: ", type(f5)) f5Type: >> f6 = 12.3 * 0.1 >> print("f6Value: ", f6) f6Value: 1.2300000000000002 >> print("f6Type: ", type(f6)) f6Type: 为什么Python浮点类型存在误差
主要还是因浮点数在计算机中实际是以二进制保存的,有些数不精确。
比如说: 0.1是十进制,转化为二进制后它是个无限循环的数:
0.00011001100110011001100110011001100110011001100110011001100
而python是以双精度(64)位来保存浮点数,多余的位会被截掉,所以看到的是0.1,但在电脑上实际保存的已不是精确的0.1,参与运算后,也就有可能点误差。# 解决方法 from decimal import * a = Decimal('4.2') b = Decimal('2.1') c = a * bPython复数类型(complex)详解
复数由实部(real)和虚部(imag)构成,在Python中,复数的虚部以j或者J作为后缀,具体格式为:
a + bj # a表示实部,b表示虚部。
Python字符串详解(包含长字符串和原始字符串)
字符串必须由双引号” “或者单引号’ ‘包围,具体格式为:
“字符串内容”
‘字符串内容’
字符串的内容可以包含字母、标点、特殊符号、中文、日文等全世界的所有文字。字符串中的双引号和单引号没有任何区别,而有些编程语言的双引号字符串可以解析变量,单引号字符串一律原样输出。
处理字符串中的引号
当字符串内容中出现引号时,我们需要进行特殊处理,否则Python会解析出错,处理方案如下:
1.对引号进行转义
在引号前面添加反斜杠\就可以对引号进行转义,让 Python 把它作为普通文本对待,例如:
>>> str1 = 'I\'m a great Person'
>>> print(str1)
I'm a great Person
>>> str2 = "引文双引号是\",中文双引号是"
>>> print(str2)
引文双引号是",中文双引号是
2.使用不同的引号包围字符串
字符串内容中出现了单引号,那么我们可以使用双引号包围字符串,反之亦然。
>>> str1 = "I'm a great coder!"
>>> print(str1)
I'm a great coder!
字符串的换行
Python 不是格式自由的语言,它对程序的换行、缩进都有严格的语法要求。要想换行书写一个比较长的字符串,必须在行尾添加反斜杠\,python也支持表达式的换行。
>>> s2 = "It took six months to writer \
... Please give me more support. \
... I will keep !"
>>> print(s2)
It took six months to writer Please give me more support. I will keep !
Python原始字符串
为了解决转义字符的问题,Python 支持原始字符串。在原始字符串中,\不会被当作转义字符,所有的内容都保持“原汁原味”的样子。在普通字符串或者长字符串的开头加上r前缀,就变成了原始字符串,具体格式为:
str1 = r’原始字符串内容’
str2 = r”””原始字符串内容”””>> str1 = r'I\'m a great coder!' >> print(str1) I\'m a great coder!Python 原始字符串中的反斜杠仍然会对引号进行转义,因此原始字符串的结尾处不能是反斜杠,否则字符串结尾处的引号会被转义,导致字符串不能正确结束。
在 Python 中有两种方式解决这个问题:一种方式是改用长字符串的写法,不要使用原始字符串;另一种方式是单独书写反斜杠。
>>> str1 = r'D:\Program Files\Python 3.8' '\\'
>>> print(str1)
D:\Program Files\Python 3.8\
编码格式
ASCII码,全称为美国信息交换标准代码,是基于拉丁字母的一套字符编码,主要用于显示现代英语,因为万维网的出现,使得 ASCII码广为使用,其直到2007年12月才逐渐被Unicode取代。nicode字符集可以使用的编码方案有三种,分别是:
- UTF-8:一种变长的编码方案,使用1~6个字节来存储;
- UTF-32:一种固定长度的编码方案,不管字符编号大小,始终使用4个字节来存储;
- UTF-16:介于UTF-8和UTF-32之间,使用2个或者4个字节来存储,长度既固定又可变。
Python使用的字符编码
Python3.x中,字符串采用的是Unicode字符集,可以用如下代码来查看当前环境的编码格式:
虽然Python默认采用UTF-8编码,但它也提供了encode()方法,可以轻松实现将Unicode编码格式的字符串转化为其它编码格式。>>> import sys >>> sys.getdefaultencoding() 'utf-8' # 使用ord()和chr()函数实现字符和编码数字之间的转换 >>> ord('Q') 81 >>> chr(81) 'Q' >>> ord("网") 32593 >>> chr(32593) '网'Bytes类型及其用法
字节串(bytes)和字符串(string)的对比: - 字符串由若干个字符组成,以字符为单位进行操作;字节串由若干个字节组成,以字节为单位进行操作。
- 字节串和字符串除了操作的数据单元不同之外,它们支持的所有方法都基本相同。
- 字节串和字符串都是不可变序列,不能随意增加和删除数据。
bytes只负责以字节序列的形式(二进制形式)来存储数据,至于这些数据到底表示什么内容(字符串、数字、图片、音频等),完全由程序的解析方式决定。如果采用合适的字符编码方式(字符集),字节串可以恢复成字符串;反之亦然,字符串也可以转换成字节串。
- 如果字符串的内容都是ASCII字符,那么直接在字符串前面添加b前缀就可以转换成 bytes。
- bytes是一个类,调用它的构造方法,也就是bytes(),可以将字符串按照指定的字符集转换成bytes;如果不指定字符集,那么默认采用UTF-8。
- 字符串本身有一个encode()方法,该方法专门用来将字符串按照指定的字符集转换成对应的字节串;如果不指定字符集,那么默认采用 UTF-8。
>>> b5 = "个人博客".encode('UTF-8') >>> print(b5) b'\xe4\xb8\xaa\xe4\xba\xba\xe5\x8d\x9a\xe5\xae\xa2'Python bool布尔类型
Python提供了bool 类型来表示真(对)或假(错),比如常见的5>3比较算式,这个是正确的,在程序世界里称之为真(对),Python 使用 True 来代表;再比如4 > 20比较算式,这个是错误的,在程序世界里称之为假(错),Python 使用 False 来代表。Python的缓存重用机制
Python 缓冲机制是为提高程序执行的效率服务的,实际上就是在 Python 解释器启动时从内存空间中开辟出一小部分,用来存储高频使用的数据,这样可以大大减少高频使用的数据创建时申请内存和销毁时撤销内存的开销。Python 在存储数据时,会根据数据的读取频繁程度以及内存占用情况来考虑,是否按照一定的规则将数据存储缓存中。那么问题来了,内存重用机制适用于哪些基本数据类型呢?数据类型 是否可以重用 生效范围 范围在[-5,256]之间的小整数 如果之前在程序中创建过,就直接存入缓存,后续不再创建。 全局 bool类型 字符串类型数据 大于 256 的整数 只要在本代码块内创建过,就直接缓存,后续不再创建。 本代码块 大于0的浮点型小数 小于0的浮点型小数 不进行缓存,每次都需要额外创建。 小于 -5 的整数
>>> #范围在 [-5, 256] 之间的小整数
... int1 = -5
>>> int2 = -5
>>> print("[-5, 256] 情况下的两个变量:", id(int1), id(int2))
[-5, 256] 情况下的两个变量: 10914304 10914304
>>> #bool类型
... bool1 = True
>>> bool2 = True
>>> print("bool类型情况下的两个变量:",id(bool1),id(bool2))
bool类型情况下的两个变量: 10302848 10302848
Python input()函数:获取用户输入的字符串
input() 函数的用法为:
str = input(tipmsg)
说明:
- str 表示一个字符串类型的变量,input 会将读取到的字符串放入 str 中。
- tipmsg 表示提示信息,它会显示在控制台上,告诉用户应该输入什么样的内容;如果不写 tipmsg,就不会有任何提示信息。
可以使用 Python 内置函数将字符串转换成想要的类型,比如:
- int(string) 将字符串转换成 int 类型;
- float(string) 将字符串转换成 float 类型;
- bool(string) 将字符串转换成 bool 类型。
Print()函数的高级用法
使用 print() 函数时,都只输出了一个变量,但实际上 print() 函数完全可以同时输出多个变量,而且它具有更多丰富的功能。详细语法格式如下:print (value,…,sep=’’,end=’\n’,file=sys.stdout,flush=False)
value 参数可以接受任意多个变量或值,因此 print() 函数完全可以输出多个值。例如如下代码:
>>> user_name='Charlie'
>>> user_age = 8
>>> print("读者名:",user_name,"年龄:",user_age)
读者名: Charlie 年龄: 8
# 指定分隔符
>>> print("读者名:",user_name,"年龄:",user_age, sep='|')
读者名:|Charlie|年龄:|8
#设置end 参数,指定输出之后不再换行
>>> print(40,'\t',end="")
40 >>>
file 参数指定 print() 函数的输出目标,file 参数的默认值为 sys.stdout,该默认值代表了系统标准输出,也就是屏幕,因此 print() 函数默认输出到屏幕。
f = open("./demo.txt", "w")
print('沧海月明珠有泪', file=f)
print('蓝回日暖玉生烟', file=f)
f.close()
Python格式化字符串
print() 函数使用以%开头的转换说明符对各种类型的数据进行格式化输出。
| 转换说明符 | 解释 |
| ————— | ——————————————————— |
| %d、%i | 转换为带符号的十进制整数 |
| %o | 转换为带符号的八进制整数 |
| %x、%X | 转换为带符号的十六进制整数 |
| %e | 转化为科学计数法表示的浮点数(e 小写) |
| %E | 转化为科学计数法表示的浮点数(E 大写) |
| %f、%F | 转化为十进制浮点数 |
| %g | 智能选择使用 %f 或 %e 格式 |
| %G | 智能选择使用 %F 或 %E 格式 |
| %c | 格式化字符及其 ASCII 码 |
| %r | 使用 repr() 函数将表达式转换为字符串 |
| %s | 使用 str() 函数将表达式转换为字符串 |
指定最小输出宽度
当使用表1中的转换说明符时,可以使用下面的格式指定最小输出宽度(至少占用多少个字符的位置):
- %10d 表示输出的整数宽度至少为 10;
- %20s 表示输出的字符串宽度至少为 20。
>>> n = 1234567 >>> print("n(10):%10d." % n) n(10): 1234567. >>> print("n(5):%5d." % n) n(5):1234567.指定对齐方式
默认情况下,print()输出的数据总是右对齐的。也就是说,当数据不够宽时,数据总是靠右边输出,而在左边补充空格以达到指定的宽度。Python 允许在最小宽度之前增加一个标志来改变对齐方式,Python 支持的标志如下:
| 标志 | 说明 |
| —— | ——————————————————————— |
| - | 指定左对齐 |
| + | 表示输出的数字总要带着符号;整数带+,负数带-。 |
| 0 | 表示宽度不足时补充 0,而不是补充空格。 |
说明: - 对于整数,指定左对齐时,在右边补0是没有效果的,因为这样会改变整数的值。
- 对于小数,以上三个标志可以同时存在。
- 对于字符串,只能使用-标志,因为符号对于字符串没有意义,而补0会改变字符串的值。
>>> n = 123456 >>> print("n(09):%09d" % n) n(09):000123456 >>> print("n(+9):%+9d" % n) n(+9): +123456 >>> f = 140.5 >>> print("f(-+0):%-+010f" % f) f(-+0):+140.500000 >>> s = "Hello" >>> print("s(-10):%-10s." % s) s(-10):Hello .指定小数精度
对于小数(浮点数),print() 还允许指定小数点后的数字位数,也即指定小数的输出精度。精度值需要放在最小宽度之后,中间用点号.隔开;也可以不写最小宽度,只写精度。具体格式如下:%m.nf %.nf # m表示最小宽度,n表示输出精度,.是必须存在的。
>> f = 3.141592653 >> print("%8.3f" % f) 3.142 >> print("%08.3f" % f) 0003.142 >> print("%+08.3f" % f) +003.142转义字符及用法
ASCII 编码,0~31(十进制)范围内的字符为控制字符,它们都是看不见的,不能在显示器上显示,甚至无法从键盘输入,只能用转义字符的形式来表示。不过,直接使用ASCII 码记忆不方便,也不容易理解,所以,针对常用的控制字符,C语言又定义了简写方式,完整的列表如下。
| 转义字符 | 说明 |
| ———— | —————————————————————————— |
| \n | 换行符,将光标位置移到下一行开头 |
| \r | 回车符,将光标位置移到本行开头 |
| \t | 水平制表符,Tab键,相当于四个空格 |
| \b | 退格(Backspace),将光标位置移到前一列 |
| \\ | 反斜线 |
| \’ | 单引号 |
| \” | 双引号 |
| \ | 在字符串行尾的续行符,即一行未完,转到下一行继续写。 |Python数据类型转换
Python 已经为我们提供了多种可实现数据类型转换的函数,如下表:
| 函数 | 作用 |
| ———————————- | ————————————————————————— |
| int(x) | 将x转换成整数类型 |
| float(x) | 将x转换成浮点数类型 |
| complex(real, [,image]) | 创建一个复数 |
| str(x) | 将x转换成字符串 |
| repr(x) | 将x转换为表达式字符串 |
| eval(str) | 计算在字符串中的有效 Python 表达式,并返回一个对象 |
| chr(x) | 将整数x转换为一个字符 |
| ord(x) | 将一个字符x转换为它对应的整数值 |
| hex(x) | 将一个整数x转换为一个十六进制字符串 |
| oct(x) | 将一个整数 x 转换为一个八进制的字符串 |Python算术运算符及用法详解
算术运算符也即数学运算符,用来对数字进行数学运算,比如加减乘除。下表列出了 Python 支持所有基本算术运算符。
| 运算符 | 说明 | 实例 | 结果 |
| ——— | —————————————————- | ————- | ——————- |
| + | 加 | 12.45+15 | 27.45 |
| - | 减 | 4.56-0.26 | 4.3 |
| | 乘 | 53.6 | 18.0 |
| / | 除法 | 7/2 | 3.5 |
| // | 整除 | 7//2 | 3 |
| % | 取余 | 7%2 | 1 |
| | 幂运算/次方运算,即返回 x 的 y 次方 | 24 | 16,即$2^{4}$ |Python赋值运算符
赋值运算符用来把右侧的值传递给左侧的变量(或者常量);可以直接将右侧的值交给左侧的变量,也可以进行某些运算后再交给左侧的变量,比如加减乘除、函数调用、逻辑运算等。
Python扩展赋值运算符如下表:

Python位运算符
Python 位运算按照数据在内存中的二进制位(Bit)进行操作,它一般用于底层开发(算法设计、驱动、图像处理、单片机等),在应用层开发(Web 开发、Linux 运维等)中并不常见。Python 支持的位运算符如下表所示。
| 位运算符 | 说明 | 使用形式 | 举例 |
| ———— | ———— | ———— | ———————————————— |
| & | 按位与 | a&b | 4&5 |
| | | 按位或 | a|b | 4|5 |
| ^ | 按位异或 | a^b | 4^5 |
| ~ | 按位取反 | ~a | ~4 |
| << | 按位左移 | a<> | 按位右移 | a>>b | 4 >> 2,表示整数 4 按位右移 2 位 |
Python比较运算符
比较运算符,也称关系运算符,用于对常量、变量或表达式的结果进行大小比较。如果这种比较是成立的,则返回True(真),反之则返回False(假)。支持的比较运算符如表所示:
比较运算符 说明
| > | 大于,如果>前面的值大于后面的值,则返回 True,否则返回 False。 |
| ——— | ———————————————————————————————————————————————- |
| < | 小于,如果<前面的值小于后面的值,则返回 True,否则返回 False。 |
| == | 等于,如果==两边的值相等,则返回 True,否则返回 False。 |
| >= | 大于等于(等价于数学中的 ≥),如果>=前面的值大于或者等于后面的值,则返回 True,否则返回 False。 |
| <= | 小于等于(等价于数学中的 ≤),如果<=前面的值小于或者等于后面的值,则返回 True,否则返回 False。 |
| != | 不等于(等价于数学中的 ≠),如果!=两边的值不相等,则返回 True,否则返回 False。 |
| is | 判断两个变量所引用的对象是否相同,如果相同则返回 True,否则返回 False。 |
| is not | 判断两个变量所引用的对象是否不相同,如果不相同则返回 True,否则返回 False。 |
import time #引入time模块
t1 = time.gmtime() # gmtime()用来获取当前时间
t2 = time.gmtime()
print(t1 == t2) #输出True
print(t1 is t2) #输出False
# t1与t2值相等,但是两个不同的对象
Python的逻辑运算符及其用法
常用逻辑运算符及功能如下:
| 逻辑运算符 | 含义 | 基本格式 | 说明 |
| ————— | ——————————————— | ———— | ————————————————————————————————————————————- |
| and | 逻辑与运算,等价于数学中的“且” | a and b | 当 a 和 b 两个表达式都为假时,a or b 的结果才是假,否则为真。 |
| or | 逻辑或运算,等价于数学中的“或” | a or b | 当 a 和 b 两个表达式都为假时,a or b 的结果才是假,否则为真。 |
| not | 逻辑非运算,等价于数学中的“非” | not a | 如果 a 为真,那么 not a 的结果为假;如果 a 为假,那么 not a 的结果为真。相当于对 a 取反。 |
Python 逻辑运算符用于操作 bool 类型的表达式,执行结果也是 bool 类型,这两点其实都是错误的!实例如下:
>>> print(100 and 200)
200
>>> print(45 and 0)
0
>>> print("" or "http://forwardpeng.club/")
http://forwardpeng.club/
逻辑运算符本质
在Python中,and 和or不一定会计算右边表达式的值,有时候只计算左边表达式的值就能得到最终结果。另外,and和or运算符会将其中一个表达式的值作为最终结果,而不是将 True 或者 False 作为最终结果。
对于 and 运算符,两边的值都为真时最终结果才为真,但是只要其中有一个值为假,那么最终结果就是假,所以 Python 按照下面的规则执行 and 运算:
- 如果左边表达式的值为假,那么就不用计算右边表达式的值了,因为不管右边表达式的值是什么,都不会影响最终结果,最终结果都是假,此时 and 会把左边表达式的值作为最终结果。
- 如果左边表达式的值为真,那么最终值是不能确定的,and 会继续计算右边表达式的值,并将右边表达式的值作为最终结果。
对于 or 运算符,情况是类似的,两边的值都为假时最终结果才为假,只要其中有一个值为真,那么最终结果就是真,所以 Python 按照下面的规则执行 or 运算:
- 如果左边表达式的值为真,那么就不用计算右边表达式的值了,因为不管右边表达式的值是什么,都不会影响最终结果,最终结果都是真,此时 or 会把左边表达式的值作为最终结果。
- 如果左边表达式的值为假,那么最终值是不能确定的,or 会继续计算右边表达式的值,并将右边表达式的值作为最终结果。
Python 三目运算符用法详解
if else 实现三目运算符(条件运算符)的格式如下:exp1 if contion else exp2
Python三目运算符支持嵌套,如此可以构成更加复杂的表达式。在嵌套时需要注意 if和else的配对,如下:
a if a>b else c if c>d else d
Python运算符优先级和结合性
Python 支持几十种运算符,被划分成将近二十个优先级,有的运算符优先级不同,有的运算符优先级相同,请看下表。
虽然 Python 运算符存在优先级的关系,但不推荐过度依赖运算符的优先级,建议:
- 不要把一个表达式写得过于复杂,如果一个表达式过于复杂,可以尝试把它拆分来书写。
- 不要过多地依赖运算符的优先级来控制表达式的执行顺序,这样可读性太差,应尽量使用( )来控制表达式的执行顺序。
运算符结合性
结合性,就是当一个表达式中出现多个优先级相同的运算符时,先执行哪个运算符:先执行左边的叫左结合性,先执行右边的叫右结合性。如:100 / 25 16,/和都具有左结合性,因此先执行左边的除法,再执行右边的乘法,最终结果是64。
Python中大部分运算符都具有左结合性,也就是从左到右执行;只有单目运算符(例如 not 逻辑非运算符)、赋值运算符和三目运算符例外,它们具有右结合性,也就是从右向左执行。表 1 中列出了所有 Python 运算符的结合性。
