Python Learning Note Day 12

2018-04-02 0 条评论 283 次阅读 1 人点赞

今天是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

Valar Morghulis

文章评论(0)