5.1 再谈print和import
5.1.1 打印多个参数
可同时打印多个表达式,条件时用逗号分隔它们:
print('Age:',42)
#运行结果
Age: 42
可自定义分隔符:
print("I","wish","to","register","a","complaint",sep="_")
#运行结果
I_wish_to_register_a_complaint
还可以自定义结束字符串,以替换默认的换行符:
print('Hello,',end='')
print('World!')
#运行结果
Hello,World!
5.1.2 导入时重命名
从模块导入时,通常使用:
- import somemodule
- from somemodule import somefunction
- from somemodule import somefunction,anotherfunction,yetanotherfunction
- from somemodule import *
仅当你确定要导入模块中的一切时,采用使用最后一种方式
但如果有两个模块,它们都包含函数open,可以使用下列方法调用函数:
module1.open()
module2.open()
1、在语句末尾添加as子句并指定别名:
import math as foobar
print(foobar.sqrt(4))
#运行结果
2.0
2、下面是一个导入特定函数并给它指定别名的例子
from math import sqrt as sq
print(sq(4))
#运行结果
2.0
5.2 赋值魔法
5.2.1 序列解包
可同时给多个变量赋值
x,y,z = 1,2,3
print(x, y, z)
#运行结果
1 2 3
使用这种方式还可交换多个变量的值
x,y,z = 1,2,3
x,y = y,x
print(x,y,z)
#运行结果
2 1 3
这里执行的操作称为序列解包:将一个序列解包,并将得到的值存储到一系列变量中
要解包的序列包含的元素个数必须与你在等号左边列出的目标个数相同,否则Python将引发异常
可使用星号运算符(*)来收集多余的值,这样无需确保值和变量的个数相同
a,b,*rest = [1,2,3,4]
print(rest)
#运行结果
[3, 4]
还可将带星号的变量放在其他位置
name = "Albus Percival Wulfric Brian Dumbledore"
first,*middle,last = name.split()
print(first)
#运行结果
Albus
赋值语句的右边可以是任何类型的序列,但带星号的变量最终包含的总是一个列表。在变量和值的个数相同时亦如此。
多适用于返回值为元组的情况,可以通过赋值语句轻松访问到元组中的每个元素。
tel = {'Tom':'000000','Jerry':'11111'}
key,value = tel.popitem()
print(key)
print(value)
#运行结果
Jerry
11111
5.2.2 链式赋值
链式赋值是一种快捷方式,用于将多个变量关联到同一个值。
5.2.3 增强赋值
x+=1。这称为增强赋值,适用于所有标准运算符,如*、/、%
注:不只数值型数据可以应用增强赋值,字符串也可以
5.3 代码块:缩进的乐趣
代码块是一组语句,可在满足条件时执行,可执行多次等等。代码块是通过缩进代码来创建的。
注意:也可以使用制表符来缩进代码块,但标准的做法是只使用空格来缩进,且每级缩进4个空格。
在Python中,使用冒号指出接下来是一个代码块,并将该代码块中的每行代码都缩进相同的程度。发现缩进量与之前相同时,你就知道当前代码块到此结束了。
5.4 条件和条件语句
5.4.1 布尔值
用作布尔表达式时,下面的值都将被解释器视为假:
False None 0 “” () [] {}
其他各种值都被视为真,包括特殊值True
5.4.2 有条件地执行和if语句
if语句,让你能够有条件地执行代码
如果条件(if和冒号之间的表达式)为真,就执行后续代码块;如果条件为假,就不执行
5.4.3 else子句
之所以叫子句是因为else不是独立的语句,而是if语句的一部分
5.4.4 elif子句
要检查多个条件,可使用elif
elif是else if的缩写,由一个if子句和一个else子句组合而成,也就是包含条件的else子句
5.4.5 代码块嵌套
可将if语句放在其他if语句块中
5.4.6 更复杂的条件
1、比较运算符
在条件表达式中,最基本的运算符可能是比较运算符,它们用于执行比较。
与赋值一样,Python也支持链式比较:可同时使用多个比较运算符,如0<age<100
“==”和“is”
==用来检查两个对象是否相等,而is用来检查两个对象是否相同
字符串和序列的比较
先比较第一个字符或元素,若相等,则接着比较下一个
2、逻辑运算符
and、or、not
逻辑运算符有段落逻辑的特征
5.4.7 断言
可在程序中添加assert语句充当检查点
5.5 循环
5.5.1 while循环
name = ''
while not name:
name = input('Please enter your name: ')
print('Hello, {}!'.format(name))
#运行结果
Please enter your name:
Please enter your name:
Please enter your name: Tom
Hello, Tom!
5.5.2 for循环
可迭代对象是可使用for循环进行遍历的对象。就目前而言,只需将可迭代对象视为序列即可。
Python提供了一个创建范围的内置函数
range(0,10)
range(10)
只要能够使用for循环,就不要使用while循环
5.5.3 迭代字典
要遍历字典的所有关键字,可像遍历序列那样使用普通的for语句
d = {'x':1,'y':2,'z':3}
for key in d:
print(key,'corresponds to',d[key])
#运行结果
x corresponds to 1
y corresponds to 2
z corresponds to 3
也可以使用keys等字典方法来获取所有的键。如果只对值感兴趣,可使用d.values。你可能还记得,d.items以元组的方式返回键-值对。
for循环的优点之一是,可在其中使用序列解包
d = {'x':1,'y':2,'z':3}
for key,value in d.items():
print(key,'corresponds to', value)
#运行结果
x corresponds to 1
y corresponds to 2
z corresponds to 3
5.5.4 一些迭代工具
Python提供了多个可帮助迭代序列的函数
1、并行迭代
有时候,你可能想同时迭代两个序列。
内置函数zip,它将两个序列“缝合”起来,并返回一个由元组组成的序列。返回值是一个适合迭代的对象,要查看其内容,可使用list将其转换为列表。
“缝合”后,可在循环中将元组解包。
2、迭代时获取索引
在有些情况下,你需要在迭代对象序列的同时获取当前对象的索引。
内置函数enumerate
迭代索引-值对,其中的索引是自动提供的
lst = ['a','b','c','d','e']
for i,s in enumerate(lst):
print(i,'corresponds to',s)
#运行结果
0 corresponds to a
1 corresponds to b
2 corresponds to c
3 corresponds to d
4 corresponds to e
3、反向迭代和排序后再迭代
reversed和sorted
可用于任何序列或可迭代的对象,且不就地修改对象,而是返回翻转和排序后的版本
a='aBc'
b=sorted(a,key=str.lower)
print(b)
#运行结果
['a', 'B', 'c']
5.5.5 跳出循环
1、break
要结束循环,可使用break
2、continue
结束当前迭代,并跳到下一次迭代开头
5.5.6循环中的else子句
如何判断循环是提前结束还是正常结束的呢?
可在循环开始前定义一个布尔变量并将其设置为False,再在跳出循环时将其设置为True。这样可在循环后面使用一条if语句来判断循环是否提前结束的
一种更简单的办法是在循环中添加一条else子句,它仅在没有调用break时才执行
from math import sqrt
for n in range(99, 81, -1):
root = sqrt(n)
if root == int(root):
print(n)
break
else:
print("Didn't find it!")
#运行结果
Didn't find it!
5.6 简单推导
列表推导是一种从其他列表创建列表的方式,类似于数学中的集合推导。
a=[x * x for x in range(10)]
print(a)
#运行结果
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
能被3整除的平方值
b=[x*x for x in range(10) if x%3 ==0]
print(b)
#运行结果
[0, 9, 36, 81]
生成二维坐标系,网格交叉点的所有坐标
result = []
for x in range(3):
for y in range(3):
result.append((x,y))
print(result)
#运行结果
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
5.7 三人行
三条语句:pass、del、exec
5.7.1 什么都不做
在你编写代码时,可将pass用作占位符
5.7.2 使用del删除
对于你不再使用的对象,Python通常会将其删除
最初, robin和scoundrel指向同一个字典,因此将None赋给scoundrel后,依然可以通过robin来访问这个字典。但将robin也设置为None之后,这个字典就漂浮在计算机内存中,没有任何名称与之相关联,再也无法获取或使用它了。因此,智慧无穷的Python解释器直接将其删除。这被称为垃圾收集。请注意,在前面的代码中,也可将其他任何值(而不是None)赋给两个变量,这样字典也将消失。
另一种方法是使用del语句。这不仅会删除到对象的引用,还会删除名称本身
但要注意下面这种情况
5.7.3 使用exec和eval执行字符串及计算其结果
函数exec将字符串作为代码执行
exec("print('Hello, world!')")
#运行结果
Hello, world!
exec执行一系列Python语句,而eval计算用字符串表示的Python表达式的值,并返回结果
a=eval("30*3+2")
print(a)
#运行结果
92
a=eval("input('user>')")
print(a)
#运行结果
user>30*3
30*3
a=eval(input('user>'))
print(a)
#运行结果
user>30*3
90