Python Learning Note Day 12
今天是Python学习第十二天,主要学习内容是针对条件、循环及其他语句,其中print打印多个参数、序列解包、链式赋值、断言、并行迭代、exec 和 eval等都是上一本书里没有提到过的东西。
接下就来总结下这部分补充的知识。
补充知识
1. print可以打印多个参数
fname = 'Kiwi' lname = 'qing' print(fname,lname) # Kiwi qing # 这样会在二者之间插入一个空格
print(fname,',',lname) # Kiwi , qing # 为了不有那么多的空格,你可以这样做: print(fname+',',lname)
还可自定义分隔符
# 还可自定义分隔符 print(fname,lname,fname,sep='❤') #Kiwi❤qing❤Kiwi
你还可自定义结束字符串,以替换默认的换行符。例如,如果将结束字符串指定为空字符串,以后就可继续打印到当前行。
print('I love ',end='') print('fengyunxia') # I love fengyunxia
2. 可同时(并行)给多个变量赋值
# 可同时(并行)给多个变量赋值 x,y,z = 1,2,3 print(x,y,z) # 1 2 3 x,y = y,x print(x,y,z) # 2 1 3
3. 序列解包(或可迭代对象解包)
将一个序列(或任何可迭代对象)解包,并将得到的值存储到一系列变量中。
values = 1,2,3,4,5 print(values) # (1, 2, 3, 4, 5) x,y,z,a,b = values print(a,b,x,y,z) # 4 5 1 2 3
方法popitem它随便获取一个键-值对并以元组的方式返回。接下来,可直接将返回的元组解包到两个变量中。
a = {'Kiwi':26,'Shine':25,'Bye':23} tryit = a.popitem() print(tryit) # ('Bye', 23) key,value = tryit print(key,value) # Bye 23
可使用星号运算符(*)来收集多余的值,这样无需确保值和变量的个数相同
a, b, *rest = [1, 2, 3, 4] print(a)# 1 print(b)# 2 print(rest)# [3'4]
还可将带星号的变量放在其他位置。
name = "I love FYX and python" first, *middle, last = name.split() print(first,last) # I python print(middle) # ['love FYX and', 'FYX ', 'and']
赋值语句的右边可以是任何类型的序列,但带星号的变量最终包含的总是一个列表。在变量和值的个数相同时亦如此。
a, *b, c = "abc" print(a, b, c ) # a ['b'] c
4. 链式赋值
x = y = 23 print(x)# 23 print(y)# 23 y = 32 print(x)# 23 print(y)# 32 # 改变链式赋值的其中一个值别的值不会改变
5. endswith(str)方法
如果某个字符串以str结尾就返回真,反之亦然
name = input('What is your name?') if name.endswith('Gumby'): print('Hello, Mr. Gumby') else: print('Hello, stranger')
6. 三目运算符(???)
status = "friend" if name.endswith("Gumby") else "stranger" print(status) score = input('Score: ') grade = '不及格' if int(score) < 60 else '及格' print(grade)
7. 关键字assert
# 关键字assert
age = 23
assert 0 < age < 100
# age=-12
# assert 0 < age < 100
# Traceback (most recent call last):
# File "D:/python-learning-note/day12/03-if.py", line 19, in <module>
# assert 0 < age < 100
# AssertionError
8. 并行迭代
# 并行迭代 name=['kiwi','tina','shine','liam'] age=['25','36','24','30'] for name,age in zip(name,age): print(name+"'s name is "+str(age))
函数zip,它将两个序列“缝合”起来,并返回一个由元组组成的序列。返回值是一个适合迭代的对象,要查看其内容,可使用list将其转换为列表。
name=['kiwi','tina','shine','liam'] age=['25','36','24','30'] print(list(zip(name,age))) # [('kiwi', '25'), ('tina', '36'), ('shine', '24'), ('liam', '30')]
函数zip可用于“缝合”任意数量的序列。需要指出的是,当序列的长度不同时,函数zip将在最短的序列用完后停止“缝合”。
a=list(zip(range(5), range(100000000))) print(a) # [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
内置函数enumerate让你能够迭代索引-值对,其中的索引是自动提供的。
9. 函数exec
函数exec将字符串作为代码执行。
exec('print(\'hello\')') # hello
调用函数exec时只给它提供一个参数绝非好事。在大多数情况下,还应向它传递一个命名空间——用于放置变量的地方;否则代码将污染你的命名空间,即修改你的变量。例如,假设代码使用了名称sqrt,结果将如何呢?
>>> from math import sqrt >>> exec("sqrt = 1") >>> sqrt(4) Traceback (most recent call last): File "<pyshell#18>", line 1, in ? sqrt(4) TypeError: object is not callable: 1
既然如此,为何要将字符串作为代码执行呢?函数exec主要用于动态地创建代码字符串。如果这种字符串来自其他地方(可能是用户),几乎无法确定它将包含什么内容。因此为了安全起见,要提供一个字典以充当命名空间。
from math import sqrt scope = {} exec("sqrt = 1",scope) print(sqrt(4))
10. eval
eval是一个类似于exec的内置函数。exec执行一系列Python语句,而eval计算用字符串表示的Python表达式的值,并返回结果(exec什么都不返回,因为它本身是条语句)。例如,你可使用如下代码来创建一个Python计算器:
result=eval(input("Enter an arithmetic expression: ")) print(result)
与exec一样,也可向eval提供一个命名空间,虽然表达式通常不会像语句那样给变量重新赋值。
虽然表达式通常不会给变量重新赋值,但绝对能够这样做,如调用给全局变量重新赋值的函数。因此,将eval用于不可信任的代码并不比使用exec安全。当前,在Python中执行不可信任的代码时,没有安全的办法。一种替代解决方案是使用Jython等Python实现,以使用Java沙箱等原生机制。
11. 新函数
函数 | 描述 |
---|---|
chr(n) | 返回一个字符串,其中只包含一个字符,这个字符对应于传入的顺序值n(0 ≤ n < 256) |
eval(source[,globals[,locals]]) | 计算并返回字符串表示的表达式的结果 |
exec(source[, globals[, locals]]) | 将字符串作为语句执行 |
enumerate(seq) | 生成可迭代的索引值对 |
ord(c) | 接受一个只包含一个字符的字符串,并返回这个字符的顺序值(一个整数) |
range([start,] stop[, step]) | 创建一个由整数组成的列表 |
reversed(seq) | 按相反的顺序返回seq中的值,以便用于迭代 |
sorted(seq[,cmp][,key][,reverse]) | 返回一个列表,其中包含seq中的所有值且这些值是经过排序的 |
xrange([start,] stop[, step]) | 创建一个用于迭代的xrange对象 |
zip(seq1, seq2,...) | 创建一个适合用于并行迭代的新序列 |
版权声明:
作者:Kiwi
链接:https://www.qingwei.tech/programe-develops/924.html
来源:清渭技术小站
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论