机器人 救救瓜
Toggle navigation
Home
SCM-tool
Linux
Jenkins
SVN
other
About Me
Archives
Tags
python 笔记之 python 断言 并行迭代 pass、del和exec ,exec 和 eval
? python ?
2021-03-10 17:11:40
256
0
0
gua_l
? python ?
Python 断言 并行迭代 异常 ### 断言 assert 如果知道必须满足特定条件,程序才能正确地运行,可在程序中添加assert语句充当检查点,这很有帮助。还可在条件后面添加一个字符串,对断言做出说明。 ``` >>> age = -1 >>> assert 0 < age < 100, 'The age must be realistic' Traceback (most recent call last): File "<stdin>", line 1, in ? AssertionError: The age must be realistic ``` ### 并行迭代 用内置函数 zip 有时候,你可能想同时迭代两个序列。假设有下面两个列表: ``` names = ['anne', 'beth', 'george', 'damon'] ages = [12, 45, 32, 102] ``` 一个很有用的并行迭代工具是内置函数zip,它将两个序列“缝合”起来,并返回一个由元组组成的序列。返回值是一个适合迭代的对象,要查看其内容,可使用list将其转换为列表。 ``` >>> list(zip(names, ages)) [('anne', 12), ('beth', 45), ('george', 32), ('damon', 102)] ``` “缝合”后,可在循环中将元组解包。 ``` for name, age in zip(names, ages): print(name, 'is', age, 'years old') ``` 函数zip可用于“缝合”任意数量的序列。需要指出的是,当序列的长度不同时,函数zip将在最短的序列用完后停止“缝合”。 ``` >>> list(zip(range(5), range(100000000))) [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)] ``` ### 迭代时获取索引 使用内置函数enumerate。 ``` for index, string in enumerate(strings): xxxxxx ``` ### 用while 等待用户输入 可以使用循环来确保用户输入名字,如下所示: ``` name = '' while not name: name = input('Please enter your name: ') print('Hello, {}!'.format(name)) ``` 请尝试运行这些代码,并在要求你输入名字时直接按回车键。你会看到提示信息再次出现,因为name还是为空字符串,这相当于假。 提示 如果你只是输入一个空格字符(将其作为你的名字),结果将如何呢?试试看。程序将接受这个名字,因为包含一个空格字符的字符串不是空的,因此不会将name视为假。这无疑是这个小程序的一个瑕疵,但很容易修复:只需将while not name改为while not name or name.isspace()或while not name.strip()即可。 ### while true ``` while True: word = input('Please enter a word: ') if not word: break # 使用这个单词做些事情: print('The word was ', word) ``` while True导致循环永不结束,但你将条件放在了循环体内的一条if语句中,而这条if语句 将在条件满足时调用break。这说明并非只能像常规while循环那样在循环开头结束循环,而是可 在循环体的任何地方结束循环。if/break行将整个循环分成两部分:第一部分负责设置(如果使 用常规while循环,将重复这部分),第二部分在循环条件为真时使用第一部分初始化的数据 ### pass、del和exec #### pass pass 什么也不做,常用作使语法通过的占位符 ``` elif name == 'Enid': # 还未完成…… pass ``` #### del 使用 del 删除,对于你不再使用的对象,Python通常会将其删除(因为没有任何变量或数据结构成员指向它)。 ``` >>> scoundrel = {'age': 42, 'first name': 'Robin', 'last name': 'of Locksley'} >>> robin = scoundrel >>> scoundrel {'age': 42, 'first name': 'Robin', 'last name': 'of Locksley'} >>> robin {'age': 42, 'first name': 'Robin', 'last name': 'of Locksley'} >>> scoundrel = None >>> robin {'age': 42, 'first name': 'Robin', 'last name': 'of Locksley'} >>> robin = None ``` 最初,robin和scoundrel指向同一个字典,因此将None赋给scoundrel后,依然可以通过robin来访问这个字典。但将robin也设置为None之后,这个字典就漂浮在计算机内存中,没有任何名称与之相关联,再也无法获取或使用它了。因此,智慧无穷的Python解释器直接将其删除。这被称为**垃圾收集**。请注意,在前面的代码中,也可将其他任何值(而不是None)赋给两个变量,这 样字典也将消失。 另一种办法是使用del语句。 **这不仅会删除到对象的引用,还会删除名称本身。** ``` >>> x = 1 >>> del x >>> x Traceback (most recent call last): File "<pyshell#255>", line 1, in ? x NameError: name 'x' is not defined ``` 这看似简单,但有时不太好理解。例如,在下面的示例中,x和y指向同一个列表: ``` >>> x = ["Hello", "world"] >>> y = x >>> y[1] = "Python" >>> x ['Hello', 'Python'] #你可能认为通过删除x,也将删除y,但情况并非如此。 >>> del x >>> y ['Hello', 'Python'] ``` 这是为什么呢?x和y指向同一个列表,但删除x对y没有任何影响,因为你只删除名称x,而当索引行不通时没有删除列表本身(值)。事实上,在Python中,根本就没有办法删除值,而且你也不需要这样做,因为对于你不再使用的值,Python解释器会立即将其删除。 ### 使用 exec 和 eval 执行字符串及计算其结果 #### exec 函数exec主要用于动态地创建代码字符串。如果这种字符串来自其他地方(可能是用户),就几乎无法确定它将包含什么内容。因此为了安全起见,要提供一个字典以充当命名空间。 ``` >>> from math import sqrt >>> scope = {} >>> exec('sqrt = 1', scope) >>> sqrt(4) 2.0 >>> scope['sqrt'] 1 ``` #### eval eval是一个类似于exec的内置函数。exec执行一系列Python语句,而eval计算用字符串表示的Python表达式的值,并返回结果(exec什么都不返回,因为它本身是条语句)。例如,你可使用如下代码来创建一个Python计算器: ``` >>> eval(input("Enter an arithmetic expression: ")) Enter an arithmetic expression: 6 + 18 * 2 42 ``` 与exec一样,也可向eval提供一个命名空间,虽然表达式通常不会像语句那样给变量重新赋值。 向exec或eval提供命名空间时,可在使用这个命名空间前在其中添加一些值。 ``` >>> scope = {} >>> scope['x'] = 2 >>> scope['y'] = 3 >>> eval('x * y', scope) 6 ```
Pre:
python 笔记之 多态、封装、方法、属性、超类和继承
Next:
python 笔记之 文件操作
0
likes
256
Weibo
Wechat
Tencent Weibo
QQ Zone
RenRen
Submit
Sign in
to leave a comment.
No Leanote account?
Sign up now.
0
comments
More...
Table of content
No Leanote account? Sign up now.