Python学习笔记 第1章 基础知识
Python学习笔记 第1章 基础知识
1.1 使用pip工具管理扩展库
- 列出已安装模块和版本号,使用重定向符>把信息保存到xxx.txt 文件
# pip freeze [> 保存文件名.txt]
pip freeze [> xxx.txt]
# 列出已安装的所有包
pip list
- 在线安装xxx模块,使用,可指定版本号
# pip install 模块名[==版本号]
pip install xxx[==version]
- whl文件离线安装扩展库,python扩展库的后缀是.whl
# pip install 模块名.whl //事先要把模块放到对应的scripts文件夹中
pip install D:xxx.whl
- 读取某文件中的扩展库信息,并依次安装他们
#pip install -r 包含扩展库信息的文本.txt
pip install -r xxx.txt
- 升级xxx模块
#pip install --upgrade 模块名
pip install xxx
# 批量升级库,先安装pip-review,在升级
pip install pip-review
pip-review --local --interactive
- 升级pip工具
python -m pip install --upgrade pip
- 查询所有过期库
pip list --outdated
- 更换国内安装源的在线安装方法
# 零时安装 pip install 模块名 -i 源地址 --trusted-host 主机地址
# --trusted-host 主机地址是为了防止出现不信任源
pip install jieba -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
# 长期更换源地址
# 直接在user目录中创建一个pip目录,如:C:\Users\xx\pip
# 新建文件 pip.ini
# 内容为
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
trusted-host = mirrors.aliyun.com
disable-pip-version-check = true
timeout = 120
# http://mirrors.aliyun.com/pypi/simple/ //阿里
# https://pypi.tuna.tsinghua.edu.cn/simple/ //清华
# http://pypi.douban.com/ //豆瓣
# http://pypi.hustunique.com/ //华中理工大学
# http://pypi.sdutlinux.org/ //山东理工大学
# http://pypi.mirrors.ustc.edu.cn/ //中国科学技术大学
- 如果遇到安装时无法访问,可在pip命令后边加上 --user
pip install jieba --user
- 查看python版本
python -V
1.2 python环境搭建
- 可以参考这篇文章利用VsCode搭建Python运行环境
1.3.1 Python的基本常识
- python内置对象查看
dir(__builtins__)
- 对象类型
| 对象类型 | 类型名称 | 示例 | 简要说明 |
|---|---|---|---|
| 数字 | int, float, complex | 1234, 3.14, 1.3e5, 3+4j | 数字大小没有限制,内置支持复数及其运算 |
| 字符串 | str | ‘swfu’, “I’m student”, ‘’‘Python ‘’’, r’abc’, R’bcd’ | 不可变,使用单引号、双引号、三引号作为定界符,以字母r或R引导的表示原始字符串 |
| 字节串 | bytes | b’hello world’ | 以字母b引导,可以使用单引号、双引号、三引号作为定界符 |
| 列表 | list | [1, 2, 3],[‘a’, ‘b’, [‘c’, 2]] | 所有元素放在一对方括号中,元素之间使用逗号分隔,其中的元素可以是任意类型 |
| 字典 | dict | {1:‘food’ ,2:‘taste’, 3:‘import’} | 所有元素放在一对大括号中,元素之间使用逗号分隔,元素形式为“键:值” |
| 元组 | tuple | (2, -5, 6), (3,) | 不可变,所有元素放在一对圆括号中,元素之间使用逗号分隔,如果元组中只有一个元素的话,后面的逗号不能省略 |
| 集合 | set, frozenset | {‘a’, ‘b’, ‘c’} | 所有元素放在一对大括号中,元素之间使用逗号分隔,元素不允许重复;另外,set是可变的,而frozenset是不可变的 |
| 布尔型 | bool | True、False | 逻辑值,关系运算符、成员测试运算符、同一性测试运算符组成的表达式的值一般为True或False |
| 空类型 | NoneType | None | 空值 |
| 异常 | Exception、ValueError、TypeError | Python内置大量异常类,分别对应不同类型的异常 | |
| 文件 | f = open(‘data.dat’, ‘rb’) | open是Python内置函数,使用指定的模式打开文件,返回文件对象 | |
| 其他可迭代对象 | 生成器对象、range对象、zip对象、enumerate对象、map对象、filter对象等等 | 具有惰性求值 的特点,除range对象之外,其他对象中的元素只能看一次 | |
| 编程单元 | 函数(使用def定义、类(使用class定义)、模块(类型为module) | 类和函数都属于可调用对象 ,模块用来集中存放函数、类、常量或其他对象 |
1.3.2 Python变量
- Python属于强类型编程语言 ,Python解释器会根据赋值或运算来自动推断变量类型。Python还是一种动态类型语言 ,变量的类型也是可以随时变化的。
- 如果变量出现在赋值运算符或复合赋值运算符(例如+=、*=等等)的左边则表示创建变量或修改变量的值 ,否则表示引用该变量的值。
>>> x = 3 #创建整型变量
>>> print(x**2)
9
>>> x += 6 #修改变量值
>>> print(x) #读取变量值并输出显示
9
>>> x = [1,2,3] #创建列表对象
>>> x[1] = 5 #修改列表元素值
>>> print(x) #输出显示整个列表
[1, 5, 3]
>>> print(x[2]) #输出显示列表指定元素
3
-
字符串、元组属于不可变序列,(不能通过下标的方式来修改其中的元素值,试图修改元组中元素的值时会抛出异常)
- 有序序列有:列表、元组、字符串
- 无序序列有:字典、集合
- 可变序列有:列表、字典、集合
- 不可变序列有:字符串、元组
-
Python采用基于值的内存管理方式 ,如果为不同变量赋值为相同值,这个值在内存中只保存一份,多个变量指向同一个值的内存空间首地址,这样可以减少内存空间的占用,提高内存利用率。
>>> x = 3
>>> id(x) # 获取x的地址
1786684560
>>> y = x # x的值赋给y
>>> id(y) # 获取x的地址
1786684560
# x和y指向同一个内存地址
- Python启动时,会对**[-5, 256]区间的 整数**进行缓存。也就是说,如果多个变量的值相等且介于[-5, 256]区间内,那么这些变量共用同一个值的内存空间。对于区间[-5, 256]区间之外的整数,同一个程序中或交互模式下同一个语句中的同值不同名变量会共用同一个内存空间 ,不同程序或交互模式下不同语句不遵守这个约定。
>>> x = -6
>>> y = -6
>>> id(x)==id(y)
False # 范围超过【-5,256】且没有在同一语句
>>> x = -5
>>> y = -5
>>> id(x) == id(y)
True # 在【-5,256】之间,虽然没在同一语句,依旧共用
>>> x = 255
>>> y = 255
>>> id(x) == id(y)
True # 在【-5,256】之间,虽然没在同一语句,依旧共用
>>> x = 256
>>> y = 256
>>> id(x) == id(y)
True # 在【-5,256】之间,虽然没在同一语句,依旧共用
>>> x = 257
>>> y = 257
>>> id(x) == id(y)
False # 范围超过【-5,256】且没有在同一语句
>>> x = 3.0
>>> y = 3.0
>>> id(x) == id(y) # 在【-5,256】之间,但是浮点数,不是整数
False
>>> x, y = 300000, 300000
>>> id(x) == id(y)
True # 范围超过【-5,256】但是在同一语句
>>> x = [666666, 666666]
>>> y = (666666, 666666)
>>> id(x[0]) == id(x[1])
True # 范围超过【-5,256】但是在同一语句
>>> id(y[0]) == id(y[1])
True # 范围超过【-5,256】但是在同一语句
>>> id(x[0]) == id(y[0])
False # 范围超过【-5,256】且没有在同一语句
- Python不会对实数进行缓存,交互模式(不在同一语句)下同值不同名的变量不共用同一个内存空间,同一个程序中的同值不同名变量会共用同一个内存空间 。
x = 30000000000
y = 30000000000
print(id(x)==id(y)) # True 同一文件内,相同的数都会共用内存地址
x = 3.4
y = 3.4
print(id(x)==id(y)) # True 同一文件内,相同的数都会共用内存地址
- 赋值语句的执行过程是:首先把等号右侧表达式的值计算出来,然后在内存中寻找一个位置把值存放进去,最后创建变量并指向这个内存地址。Python中的变量并不直接存储值,而是存储了值的内存地址或者引用 ,这也是变量类型随时可以改变的原因。
- Python具有自动管理内存 的功能,会跟踪所有的值,并自动删除不再使用或者引用次数为0的值。如果确定某个变量不再使用,可以使用del(对象名)命令显式删除该变量,值的引用次数减1,当某个值的引用次数变为0时,将会被Python的垃圾回收机制自动删除并释放内存空间。
>>> import sys # 引入sys模块
>>> sys.getrefcount(2) # sys.getrefcount(对象) 查看引用次数
77
>>> x = 2 # x指向2
>>> sys.getrefcount(2) # 再查看2的引用次数加一
78
>>> del(x) # x不再指向2
>>> sys.getrefcount(2) # 查看2的引用次数减一
77
>>> x # 再通过x已经无法访问到2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
python 变量名命名规则
变量名必须以字母、汉字或下划线开头 ,但以下划线开头的变量在Python中有特殊含义;说明如下:
* 单前导下划线_:下划线前缀的含义是告知其他程序员:以单个下划线开头的变量或方法仅供内部使用。_
* _单末尾下划线_ :单个末尾下划线(后缀)是一个约定,用来避免与Python关键字产生命名冲突。
* 双前导下划线 __:双下划线前缀会导致Python解释器重写属性名称,以避免子类中的命名冲突(名称修饰),变成“_类名__变量名”格式。
* 双前导和双末尾下划线__:如果一个名字同时以双下划线开始和结束,则不会应用名称修饰。 由双下划线前缀和后缀包围的变量不会被Python解释器修改。主要是特殊用途
* 单下划线 _:单个独立下划线是用作一个名字,来表示某个变量是临时的或无关紧要的。在交互模式下也表示最近一个表达式的值(成功)
变量名中不能有空格以及标点符号(括号、引号、逗号、斜线、反斜线、冒号、句号、问号等等);
不能使用关键字作变量名,可以导入keyword模块后使用print(keyword.kwlist)查看所有Python关键字;
>>> import keyword
>>> print(keyword.kwlist)
不建议使用系统内置的模块名、类型名或函数名以及已导入的模块名及其成员名作变量名,这将会改变其类型和含义,可以通过dir(builtins)查看所有内置模块、类型和函数(前面有记录);
变量名对英文字母的大小写敏感,例如 student 和 Student 是不同的变量。
10.
python中的关键字
| and | as | assert | break | class | continue |
|---|---|---|---|---|---|
| def | del | elif | else | except | finally |
| for | from | False | global | if | import |
| in | is | lambda | nonlocal | not | None |
| or | pass | raise | return | try | True |
| while | with | yield |
1.4 Python的对象模型详解
1.4.1 数字(number)
- 可以表示任意大小的数值,如果内存允许的情况下,数值可以是无限大。
>>> a = 99
>>> a ** a
369729637649726772657187905628805440595668764281741102430259972423552570455277523421410650010128232727940978889548326540119429996769494359451621570193644014418071060667659301384999779999159200499899
python中的整数类型(int)
* **十进制整数** : 如,0、-1、9、123
* **十六进制整数** : 需要16个数字0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f来表示整数,必须以0x开头,如0x10、0xfa、0xabcdef (a、b、c、d、e、f可以大写或者小写)
* **八进制整数** ,只需要8个数字0、1、2、3、4、5、6、7来表示整数,必须以0o开头,如0o35、0o11
* **二进制整数** ,只需要2个数字0、1来表示整数,必须以0b开头如,0b101、0b100
进制转换
十进制转其他进制:bin()、oct()、hex()
>>> oct(80) # 十进制到八进制
'0o120'
>>> bin(80) # 十进制到二进制
'0b1010000'
>>> hex(80) # 十进制到十六进制
'0x50'
原始数据为数字字符串,可以使用int(“其它进制数”, base=原进制数) ,其它进制数前可加也可不加标志
>>> int("637270012", base=8) # 八进制到十进制
108883978
>>> int("0o637270012", base=8) # 八进制到十进制
108883978
>>> int("637270012", base=16) # 十六进制到十进制
26695106578
原始数据为带进制标识的字符串,如二进制前加0b,可以使用eval()
>>> x = eval('0b1010')
>>> x
10
# eval() 函数的作用是去掉字符串最外层的引号,详细用法后面会讲到
Python 3.6.x开始支持在数字中间位置使用单个下划线作为分隔来提高数字的可读性 ,类似于数学上使用逗号作为千位分隔符。
>>> 1_000_000
1000000
>>> 1_2_3_4
1234
>>> 1_2 + 3_4j
(12+34j)
>>> 1_2.3_45
12.345
1.4.2 浮点数(float)
一般写法 15.0、0.37、-11.2、1.2e2、314.15e-2
特殊写法: .3 、12.、1_2.3_45
特殊字符串:两个无穷大的数是相等的,两个不是数"nan"比较是不相等。 *
“Infinity"或"inf”,"-Infinity"或"-inf",可以用float()转换成无穷大
>>> x=float("Infinity")
>>> x
inf
“nan”,表示不是数(not a number)
>>> x=float("nan")
>>> x
nan # 不是一个数
浮点数的有效位数是17位
1.4.3 复数(complex)
- 内置支持的复数
>>> a = 3+4j
>>> b = 5+6j
>>> c = a+b
>>> c
(8+10j)
>>> c.real #查看复数实部
8.0
>>> c.imag #查看复数虚部
10.0
>>> a.conjugate() #返回共轭复数
(3-4j)
>>> a * b #复数乘法
(-9+38j)
>>> a / b #复数除法
(0.6393442622950819+0.03278688524590165j)
1.4.4 数字类型的转换
有时候,我们需要对数据内置的类型进行转换,数据类型的转换,你只需要将数据类型作为函数名即可,complex(x) 将x转换到一个复数,实数部分为 x,虚数部分为 0;complex(x, y) 将 x 和 y 转换到一个复数,实数部分为 x,虚数部分为 y。x 和 y 是数字表达式。
>>> int(3.2)
3
>>> float(3)
3.0
>>> complex(3)
(3+0j)
>>> complex(1,2)
(1+2j)
1.4.5 字符串(str)
用单引号、双引号或三引号界定的符号系列称为字符串。
字符串属于不可变序列
单引号、双引号、三单引号、三双单引号可以互相嵌套 ,用来表示复杂字符串。
'abc'、'123'、'中国'、"Python"、'''Tom said, "Let's go"'''
空字符串表示为’'或 “”
三引号’’'或"""表示的字符串可以换行 ,支持排版较为复杂的字符串;三引号还可以在程序中表示较长的注释。
python中的单行注释是#,多行注释(块注释)是三引号
常用转义字符
| 转义字符 | 含义 | 转义字符 | 含义 |
|---|---|---|---|
| \b | 退格,把光标移动到前一列位置 | |一个斜线 | | |
| \f | 换页符 | \’ | 单引号 ’ |
| \n | 换行符 | \’’ | 双引号 ” |
| \r | 回车 | \ooo | 3位八进制数对应的字符 |
| \t | 水平制表符 | \xhh | 2位十六进制数对应的字符 |
| \v | 垂直制表符 | \uhhhh | 4位十六进制数表示的Unicode字符 |
字符串界定符前面加字母r或R表示原始字符串 ,其中的特殊字符不进行转义,但字符串的最后一个字符不能是 \。原始字符串主要用于正则表达式、文件路径或者URL的场合。
>>> path = 'C:\Windows\notepad.exe'
>>> print(path) #字符\n被转义为换行符
C:\Windows
otepad.exe
>>> path = r'C:\Windows\notepad.exe' #原始字符串,任何字符都不转义
>>> print(path)
C:\Windows\notepad.exe
>>> x=r"assd\" # 报错
File "<stdin>", line 1
x=r"assd\"
^
SyntaxError: EOL while scanning string literal
>>> x=r"assd\ "
>>> x
'assd\ \ ' # 四个杠
其他类型转换成字符串的str函数和repr函数,注意两者的区别
* str() 函数,它会把值转换为合理形式的字符串
* repr(),将值转换为合法的python表达式
>>> print(str("Hello, world!"))
Hello, world!
>>> print(str(10000)) # str()函数会把参数转换成合理的字符串,通常字符串不包含引号
10000
>>>s = 'RUNOOB' # repr()函数不会考虑合理性,直接在最外层加引号
>>> repr(s)
"'RUNOOB'"
>>> str(s)
'RUNOOB'
>>> dict = {'runoob': 'runoob.com', 'google': 'google.com'};
>>> repr(dict)
"{'google': 'google.com', 'runoob': 'runoob.com'}"
1.4.6 python的运算符以及优先级
加法运算(+)
算数加法,浮点数相加后的数有一部分在计算机中不能精确存贮
>>> 20+5
25
>>> 4.1+4.2
8.3
>>> 4.1+4.3
8.399999999999999 # 存储精度不足
+运算符除了用于算术加法以外,还可以用于列表、元组、字符串 的连接,但不支持不同类型的对象之间相加或连接 。
>>> [1, 2, 3] + [4, 5, 6] #连接两个列表
[1, 2, 3, 4, 5, 6]
>>> (1, 2, 3) + (4,) #连接两个元组
(1, 2, 3, 4)
>>> 'abcd' + '1234' #连接两个字符串
'abcd1234'
>>> 'A' + 1 #不支持字符与数字相加,抛出异常
File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
>>> True + 3 #Python内部把True当作1处理
4
>>> False + 3 #把False当作0处理
减法运算(-)
算术减法
>>> 25-5
20
>>> 5-True
4
>>> 4.3-2.1
2.1999999999999997 # 精度不足
集合做差集
>>> {1,2,3,4} - {2,4,7,8,}
{1, 3} # 在第一个集合中,排除掉第二个集合中所包含的元素
乘法运算(*)
运算符不仅可以用于数值乘法 ,还可以用于列表、字符串、元组等类型,当列表、字符串或元组等类型变量与整数进行“*”运算时,表示对内容进行重复 并返回重复后的新对象 。
>>> 2.0 * 3 #浮点数与整数相乘
6.0
>>> (3+4j) * 2 #复数与整数相乘
(6+8j)
>>> (3+4j) * (3-4j) #复数与复数相乘
(25+0j)
>>> "a" * 10 #字符串重复
'aaaaaaaaaa'
>>>[1,[1,2],3]*3 #列表重复
[1, [1, 2], 3, 1, [1, 2], 3, 1, [1, 2], 3]
>>> (1,2,[3])*3 #元组重复
(1, 2, [3], 1, 2, [3], 1, 2, [3])
除法运算,有两种,“/”和“//”分别表示除法和整除运算。(\ \ )
>>> 3 / 5
0.6
>>> 3 // 5
0
>>> 3.0 / 5
0.6
>>> 3.0 // 5
0.0
>>> 13 // 10 # 向下取整
1
>>> -13 // 10
-2 # -13/10=-1.3 向下取整就是-2
模运算(%)
%运算符除去可以用于字符串格式化之外,还可以对整数和浮点数计算余数。但是由于浮点数的精确度影响,计算结果可能略有误差 。
>>> 3.1 % 2
1.1
>>> 6.3 % 2.1
2.0999999999999996 # 误差
>>> 6 % 2
0
>>> -17 % 4 # 余数与%右侧的运算数符号一致
3
>>> 17 % -4 # (17-(-3))能被(-4)整除
-3
>>> 5.7 % 4.8
0.9000000000000004
关系运算符(<, <=, >, >=, !=, ==)
可以连用,一般用于同类型 对象之间值的大小比较,或者测试集合之间的包含关系 。
>>> 1 < 3 < 5 #等价于1 < 3 and 3 < 5
True
>>> 'Hello' > 'world' #比较字符串大小,按照ascii码依次比较
False
>>> [1, 2, 3] < [1, 2, 4] #比较列表大小
True
>>> 'Hello' > 3 #字符串和数字不能比较,会报错
TypeError: unorderable types: str() > int()
>>> {1, 2, 3} < {1, 2, 3, 4} #测试是否子集
True
成员测试运算符(in , not in),
成员测试运算符in用于成员测试 ,即测试一个对象是否为另一个对象的元素。
>>> 3 in [1, 2, 3] # 测试3是否存在于列表[1, 2, 3]中
True
>>> 5 in range(1, 10, 1)
True
# range()函数简介
# range()是用来生成指定范围数字的内置函数
# range()的类型实际上是一个iterable类型,但不是迭代器;它是不可变的序列类型,
# 可以进行判断元素、查找元素、切片等操作,但不能修改元素;
>>> x=range(1, 10, 1)
>>> x[2] # 可以多次访问,迭代对象只能访问一次
3
>>> x[2] = 7 # 不能对不可变序列赋值
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'range' object does not support item assignment
>>> 'abc' in 'abcdefg' #子字符串测试
True
>>> for i in (3, 5, 7): #循环,成员遍历
print(i, end='\t') #注意,这里打两个回车才会执行
3 5 7
同一性测试运算符(is 、is not)
同一性测试运算符(identity comparison)is用来测试两个对象是否是同一个,如果是则返回True,否则返回False。如果两个对象是同一个,二者具有相同的内存地址 。
>>> 3 is 3
True
>>> x = [300, 300, 300]
>>> x[0] is x[1] #基于值的内存管理,同一个值在内存中只有一份
True
>>> x = [1, 2, 3]
>>> y = [1, 2, 3]
>>> x is y #上面形式创建的x和y不是同一个列表对象
False
>>> x==y
True
位运算符(|、^、&、<<、>>、~)
位运算符只能用于整数 ,其内部执行过程为:首先将整数转换为二进制数,然后右对齐,必要的时候左侧补0,按位进行运算,最后再把计算结果转换为十进制数字返回。
| 运算符 | 描述 | |
|---|---|---|
| & | 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 | |
| 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 | ||
| ^ | 按位异或运算符:当两对应的二进位相异时,结果为1 | |
| ~ | 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 。~x 类似于 -x-1 | |
| << | 左移动运算符:运算数的各二进位全部左移若干位,由 < < 右边的数字指定了移动的位数,高位丢弃,低位补0。 | |
| >> | 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,> > 右边的数字指定了移动的位数 |
a = 0011 1100
b = 0000 1101
-----------------
a&b = 0000 1100 # 全1为1
a|b = 0011 1101 # 全0为0
a^b = 0011 0001 # 相同为0,不同为1
~a = 1100 0011 # 1变0,0变1
集合运算(|、^、&、-)
集合的交集、并集、对称差集等运算借助于位运算符来实现,而差集则使用减号运算符实现(注意,并集运算符不是加号 )。
>>> {1, 2, 3} | {3, 4, 5} # 并集,自动去除重复元素,重复的元素只出现一次
{1, 2, 3, 4, 5}
>>> {1, 2, 3}.union({3, 4, 5}) # (集合1).union(集合2),与上面的操作等价
{1, 2, 3, 4, 5}
>>> {1, 2, 3} & {3, 4, 5} # 差集 找出相同元素
{3}
>>> {1, 2, 3}.intersection({3, 4, 5}) # (集合1).intersection(集合2),与上面的操作等价
{3}
>>> {1, 2, 3} ^ {3, 4, 5} # 对称差集,排除两者共有的元素,共有元素不出现
{1, 2, 4, 5}
>>> {1, 2, 3}.symmetric_difference({3, 4, 5}) #同上
{1, 2, 4, 5}
>>> {1, 2, 3} - {3, 4, 5} # 前者排除后面集合中包含的元素
{1, 2}
>>> {1, 2, 3}.difference({3, 4, 5}) # 同上
{1, 2}
逻辑运算符(and 、or 、not)
and和or具有惰性求值 特点,只计算必须计算的表达式。最后一个计算的表达式的值作为整个表达式的值
| 运算符 | 逻辑表达式 | 描述 |
|---|---|---|
| and | x and y | 布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。 |
| or | x or y | 布尔"或" - 如果 x 是非 0,它返回 x 的值,否则它返回 y 的计算值。 |
| not | not x | 布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 |
>>> 3>5 and a>3 # 注意,此时并没有定义变量a
False
>>> 3>5 or a>3 # 3>5的值为False,所以需要计算后面表达式
NameError: name 'a' is not defined
>>> 3<5 or a>3 # 3<5的值为True,不需要计算后面表达式
True
>>> 3 and 5 # 最后一个计算的表达式的值作为整个表达式的值
5
>>> 3 or 5
3
>>> 3 and 5>2
True
>>> 3 not in [1, 2, 3] #逻辑非运算not
False
>>> 3 is not 5 #not的计算结果只能是True或False之一
True
逗号(,)
逗号并不是运算符,只是一个普通分隔符。
>>> 'a' in 'b', 'a'
(False, 'a') # 'a' in 'b'的值为False,False和'a'组成元组
>>> 'a' in ('b', 'a')
True # 'a' 是元组('b', 'a')的成员
>>> x = 3, 5
>>> x
(3, 5) # 元组声明时若无歧义可以不加括号
>>> 3 == 3, 5
(True, 5) # 3 == 3 表达式的值为True ,True和5组成元组
>>> x = 3+5, 7
>>> x # 3+5表达式的值为8,8和7组成元组
(8, 7)
Python不支持++和–运算符,只是两个连续的加号和减号。
在Python中,单个任何类型的对象或常数属于合法表达式,使用运算符连接的变量和常量以及函数调用的任意组合也属于合法的表达式。
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> c = a + b
>>> c
[1, 2, 3, 4, 5, 6]
>>> d = list(map(str, c))
>>> d
['1', '2', '3', '4', '5', '6']
>>> import math
>>> list(map(math.sin, c))
[0.8414709848078965, 0.9092974268256817, 0.1411200080598672, -0.7568024953079282, -0.9589242746631385, -0.27941549819892586]
>>> 'Hello' + ' ' + 'world'
'Hello world'
>>> 'welcome '
'welcome welcome welcome '
>>> ('welcome,'*3).rstrip(',')+'!' #rstrip([chars]),删除 string 字符串末尾的指定字符(默认为空格).
'welcome,welcome,welcome!'
python中的优先级,从低到高依次是
| 运算符 | 描述 | |
|---|---|---|
| := | 赋值表达式,Python 3.8新增 主要功能:可在表达式内部为变量赋值。 | |
| lambda | lambda 表达式 | |
| if – else | 条件表达式 | |
| or | 逻辑或运算 | |
| and | 逻辑与运算 | |
| not | 逻辑非运算 | |
| in, not in, is, is not, <, <=, >, >=, !=, == | 测试、比较 | |
| 位或运算 | ||
| ^ | 位异或运算 | |
| & | 位与运算 | |
| <<, >> | 左移位,右移位 | |
| +, - | 加,减 | |
| *, @, /, //, % | 乘,矩阵乘,除,整除,取余 | |
| +x, -x, ~x | 正,负,位求反 | |
| ** | 幂运算,具有右结合性 | |
| await x | await表达式 | |
| x[index], x[index:index], x(arguments…), x.attribute | 抽取,切片,调用,属性引用 | |
| (expressions…), [expressions…], {key: value…}, {expressions…} | 绑定或加圆括号的表达式,列表显示,字典显示,集合显示 |
1.5.1 内置函数详解
内置函数不需要导入任何模块即可使用
常用内置函数如下表
| 函数 | 功能简要说明 |
|---|---|
| abs(x) | 返回数字x的绝对值或复数x的模 |
| all(iterable) | 如果对于可迭代对象中所有元素x都等价于True,也就是对于所有元素x都有bool(x)等于True,则返回True。对于空的可迭代对象也返回True |
| any(iterable) | 只要可迭代对象iterable中存在元素x使得bool(x)为True,则返回True。对于空的可迭代对象,返回False |
| ascii(obj) | 把对象转换为ASCII码表示形式,必要的时候使用转义字符来表示特定的字符 |
| bin(x) | 把整数x转换为二进制串表示形式 |
| bool(x) | 返回与x等价的布尔值True或False |
| bytes(x) | 生成字节串,或把指定对象x转换为字节串表示形式 |
| callable(obj) | 测试对象obj是否可调用。类和函数是可调用的,包含__call__()方法的类的对象也是可调用的 |
| compile() | 用于把Python代码编译成可被exec()或eval()函数执行的代码对象 |
| complex(real, [imag]) | 返回复数 |
| chr(x) | 返回Unicode编码为x的字符 |
| delattr(obj, name) | 删除属性,等价于del obj.name |
| dir(obj) | 返回指定对象或模块obj的成员列表,如果不带参数则返回当前作用域内所有标识符 |
| divmod(x, y) | 返回包含整商和余数的元组((x-x%y)/y, x%y) |
| enumerate(iterable[, start]) | 返回包含元素形式为(0, iterable[0]), (1, iterable[1]), (2, iterable[2]), …的迭代器对象 |
| eval(s[, globals[, locals]]) | 计算并返回字符串s中表达式的值 |
| exec(x) | 执行代码或代码对象x |
| exit() | 退出当前解释器环境 |
| filter(func, seq) | 返回filter对象,其中包含序列seq中使得单参数函数func返回值为True的那些元素,如果函数func为None则返回包含seq中等价于True的元素的filter对象 |
| float(x) | 把整数或字符串x转换为浮点数并返回 |
| frozenset([x])) | 创建不可变的集合对象 |
| getattr(obj, name[, default]) | 获取对象中指定属性的值,等价于obj.name,如果不存在指定属性则返回default的值,如果要访问的属性不存在并且没有指定default则抛出异常 |
| globals() | 返回包含当前作用域内全局变量及其值的字典 |
| hasattr(obj, name) | 测试对象obj是否具有名为name的成员 |
| hash(x) | 返回对象x的哈希值,如果x不可哈希则抛出异常 |
| help(obj) | 返回对象obj的帮助信息 |
| hex(x) | 把整数x转换为十六进制串 |
| id(obj) | 返回对象obj的标识(内存地址) |
| input([提示]) | 显示提示,接收键盘输入的内容,返回字符串 |
| int(x[, d]) | 返回实数(float)、分数(Fraction)或高精度实数(Decimal)x的整数部分,或把d进制的字符串x转换为十进制并返回,d默认为十进制 |
| isinstance(obj, class-or-type-or-tuple) | 测试对象obj是否属于指定类型(如果有多个类型的话需要放到元组中)的实例 |
| iter(…) | 返回指定对象的可迭代对象 |
| len(obj) | 返回对象obj包含的元素个数,适用于列表、元组、集合、字典、字符串以及range对象和其他可迭代对象 |
| list([x])、set([x])、tuple([x])、dict([x]) | 把对象x转换为列表、集合、元组或字典并返回,或生成空列表、空集合、空元组、空字典 |
| locals() | 返回包含当前作用域内局部变量及其值的字典 |
| map(func, *iterables) | 返回包含若干函数值的map对象,函数func的参数分别来自于iterables指定的每个迭代对象, |
| max(x)、 min(x) | 返回可迭代对象x中的最大值、最小值,要求x中的所有元素之间可比较大小,允许指定排序规则和x为空时返回的默认值 |
| next(iterator[, default]) | 返回可迭代对象x中的下一个元素,允许指定迭代结束之后继续迭代时返回的默认值 |
| oct(x) | 把整数x转换为八进制串 |
| open(name[, mode]) | 以指定模式mode打开文件name并返回文件对象 |
| ord(x) | 返回1个字符x的Unicode编码 |
| pow(x, y, z=None) | 返回x的y次方,等价于x ** y或(x ** y) % z |
| print(value, …, sep=’ ‘, end=’\n’, file = sys. stdout, flush=False) | 基本输出函数 |
| quit() | 退出当前解释器环境 |
| range([start,] end [, step] ) | 返回range对象,其中包含左闭右开区间[start,end)内以step为步长的整数 |
| reduce(func, sequence[, initial]) | 将双参数的函数func以迭代的方式从左到右依次应用至序列seq中每个元素,最终返回单个值作为结果。在Python 2.x中该函数为内置函数,在Python 3.x中需要从functools中导入reduce函数再使用 |
| repr(obj) | 返回对象obj的规范化字符串表示形式,对于大多数对象有eval(repr(obj))==obj |
| reversed(seq) | 返回seq(可以是列表、元组、字符串、range以及其他可迭代对象)中所有元素逆序后的迭代器对象 |
| round(x [, 小数位数]) | 对x进行四舍五入,若不指定小数位数,则返回整数 |
| sorted(iterable, key=None, reverse=False) | 返回排序后的列表,其中iterable表示要排序的序列或迭代对象,key用来指定排序规则或依据,reverse用来指定升序或降序。该函数不改变iterable内任何元素的顺序 |
| str(obj) | 把对象obj直接转换为字符串 |
| sum(x, start=0) | 返回序列x中所有元素之和,返回start+sum(x) |
| type(obj) | 返回对象obj的类型 |
| zip(seq1 [, seq2 […]]) | 返回zip对象,其中元素为(seq1[i], seq2[i], …)形式的元组,最终结果中包含的元素个数取决于所有参数序列或可迭代对象中最短的那个 |
1.5.2常用内置函数
- 内置函数bin()、oct()、hex()
用来将整数转换为二进制、八进制和十六进制形式,这三个函数都要求参数必须为整数 。
>>> bin(555) # 把数字转换为二进制串
'0b1000101011'
>>> oct(555) # 转换为八进制串
'0o1053'
>>> hex(555) # 转换为十六进制串
'0x22b'
- 内置函数int()
用来把实数转换为整数,或把数字字符串按指定进制转换为十进制数 。
>>> int(3.5)
3
>>> int(-3.5)
-3
>>> int('101', 2) # 二进制, 第二个参数表示源数据的进制,源数据可以带进制标识也可以不带
5
>>> int('101', 16) # 十六进制
257
>>> int('x2', 36) # 36进制,2—36进制都可以转十进制
1190
>>> int('\t 8 \n') # 自动忽略数字两侧的空白字符
- 内置函数ascii()
ascii() 函数返回任何对象(字符串,元组,列表等)的可读版本;ascii() 函数会将所有非 ascii 字符替换为转义字符 。
# 用法 ascii(object)
>>> ascii('hello') # 返回字符串'hello'的可读版本,类似repr()函数
"'hello'"
>>> ascii('23')
"'23'"
>>> ascii((1,2,3))
'(1, 2, 3)'
>>> ascii([1,2,3])
'[1, 2, 3]'
>>> ascii({1:2,3:4})
'{1: 2, 3: 4}'
>>> ascii(12)
'12'
>>> ascii('中国') # 参数不属于ASCII码,会转换成转义字符
"'\ u4e2d\ u56fd'"
>>> eval(_) # _ 表示最近一个终端输出的结果,结果是什么类型,_ 就是什么类型,不一定是字符串
'中国'
- 内置函数max()、min()、sum()
这三个内置函数分别用于计算列表、元组或其他可迭代对象 中所有元素最大值、最小值以及所有元素之和,sum()要求元素支持加法运算 ,max()和min()则要求序列或可迭代对象中的元素之间可比较大小 。
>>> import random # 导入random模块,random库是产生随机数的库
>>> a = [random.randint(1,100) for i in range(10)] #列表推导式
>>> a
[72, 26, 80, 65, 34, 86, 19, 74, 52, 40]
"""
a = [random.randint(1,100) for i in range(10)]
for循环执行10次并运行10次random.randint(1,100)语句,
产生10个随机数,
循环每执行一次往列表里添加一个元素
第一次循环产生的随机数排在列表最前面
"""
>>> print(max(a), min(a), sum(a))
86 19 548 # 找到列表中的最大值、最小值,并计算列表中元素的和
>>> x=range(11) # 返回range类型的对象,保存到x中
>>> sum(x) # 计算range类型变量中所有元素的和
55
>>> sum(a)/len(a) # len()函数计算对象元素个数
54.8 # 此写法表示计算a列表中元素的平均值
>>> sum([1,2,3,4],4) # 计算列表各元素的和,并加上4
14
>>> sum([1,2,3,4],start=4) # 计算列表各元素的和,并加上4,start可省略
14
>>> max([1,2,22,111,31])
111
>>> max([1,2,22,111,31],key=str)
31
>>> max([1,2,22,111,31],key=lambda x:len(str(x)))
111
>>> from random import randint
>>> x=[[randint(1,50) for i in range(5)] for j in range(30)]
>>> print(x)
>>> min(*x,key=sum)
[21, 5, 33, 14, 13]
>>> x1=(1,2,3)
>>> print(*x1)
1 2 3
>>> x2=[[1,2,3],[2,3,4],[3,4,5]]
>>> print(*x2)
[1, 2, 3] [2, 3, 4] [3, 4, 5]
>>> a={1:2,2:2,3:1,4:'aa'}
>>> max(a)
4 #比较字典里面的最大值,会输出最大的键值
- ord()和chr()
ord()和chr()是一对功能相反的函数,ord()用来返回单个字符的序数或Unicode码,而chr()则用来返回某序数对应的字符,str()则直接将其任意类型参数转换为字符串。
>>> ord('a')
97 # 返回'a'的Unicode码为97
>>> chr(ord('A')+1) # 返回'A'的Unicode码,再加1转化为字符'B'
'B'
>>> str(1234)
'1234' # 把整型数字1234转化成字符串'1234'
>>> str((1,2,3))
'(1, 2, 3)' # 元组(1,2,3)转化成字符串
>>> chr(65)
'A'
>>> str(1)
'1' # 把整型数字1转化成字符串'1'
>>> str([1,2,3])
'[1, 2, 3]' # 列表[1,2,3]转化成字符串
>>> str({1,2,3})
'{1, 2, 3}' # 集合{1,2,3}转化成字符串
