【Python基础】lpthw - Exercise 37 复习各种符号
本节需要熟悉python的符号和关键字的功能。
一、关键字
1. and
逻辑与,如 True and False == False的值为True
2. as
with...as...的功能类似try...except...finally...语句,也是一种python的控制流语句。
先来看后者的功能:
1 try:
2 execution block #正常执行的模块
3 except A:
4 exc block A #发生错误A时执行
5 except B:
6 exc block B #发生错误B时执行
7 except:
8 exc other block #发生其他错误时执行
9 else:
10 jump here when no excepti #不发生错误时执行
11 finally:
12 final block #无论是否发生错误,都执行
再来看前者的功能:
1 with expression as variable:
2 with-block
其中expression是一个类对象,它必须包含__enter__和__exit__两个函数。with...as...语句执行时,先执行expression中的__enter__函数,将其返回值赋给后面的variable,然后执行with-block中语句,最后执行expression中的__exit__。如果执行with-block时一切正常,则exception_type,exception_val,trace的返回值都是null;如果发生异常、错误,则同try语句一样,这三个变量会被系统赋予相应的值。
二者逻辑是相似的,如with语句可以这样表达为try语句:
1 try:
2 __enter__
3 with-block
4 finally:
5 __exit__
3. assert
断言(确保)某东西为真。
1 assert expression, "Your prompt here."
对expression判断真假,如果为真,则不输出任何东西;如果为假,则输出其后“ ”中的提示语句,可以自定义。
4. break
立即停止循环。
用于while、for循环中,和if等语句连用为循环设置停止条件。注意,其只会使程序跳出本层循环,而外层仍会继续执行。
1 n = 0
2 while True:
3 print(n)
4 n += 1
5 if n>=10:
6 break
输出为 0 1 2 3 4 5 6 7 8 9
5. class
定义一个类。
6. continue
停止当前循环的后续步骤,再做一次循环。使用continue后,跳过当前循环后面的内容,直接开始下一次循环。
1 n = 0
2 while True:
3 n += 1
4 if n == 4 or n ==5:
5 continue
6 print(n)
7 if n >= 10:
8 break
输出为1 2 3 6 7 8 9 10
7. def
定义一个函数。
1 def function(arg1, arg2):
2 func_description
3 return val1, val2
8. del
从字典中删除元素。
【del,remove,pop的区别】
del是python语句,它可以作用在list上,但无法通过list调用,它用来删除list中指定位置的元素,并以此将后面的元素向前移动填补空位。
remove是list的操作,可以通过list调用,用于删除list中指定字符串。
pop也是list操作,用于删除list中指定位置的元素。
1 a = ['a','b','c','d','e','f','g','h']
2 print(a)
3
4 del a[3]
5 print(a)
6
7 a.remove('b')
8 print(a)
9
10 a.pop()
11 print(a)
12
13 a.pop(0)
14 print(a)
运行结果为
>>>['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
['a', 'b', 'c', 'e', 'f', 'g', 'h']
['a', 'c', 'e', 'f', 'g', 'h']
['a', 'c', 'e', 'f', 'g']
['c', 'e', 'f', 'g']
9. elif
用于if语句。
10. else
用于if语句。
11. except
用于try语句。
12. exec
将字符串作为python脚本运行。
其语法为
exec (object[, globals[, locals]])
其中object为必选参数,可以是一个字符串,也可以是一个对象。如果object是一个字符串,它会先被解析为python语句,再被执行;如果object是一个对象,则简单的被执行。exec语句返回值永远为None。
globals、locals为可选参数,分别表示全局命名空间(存放全局变量)、局部命名空间(存放局部变量),如果有,必须是字典的形式。
1 x = 10
2
3 expr = """
4 y = 20
5 sum = x + y + z
6 print(sum)
7 """
8
9 def mysum():
10 z = 20
11 exec(expr)
12 exec(expr,{'x':1,'z':2})
13 exec(expr,{'x':3,'y':5},{'x':1,'z':100})
14
15 mysum()
输出结果为50 23 121。
注意,第三个exec语句中,第一个字典{'x':3,'y':5}为全局变量,x、y的值首先被赋为3、5,第二个字典中,x的值被重新赋为1,z被赋为100expr中,而expr中定义的局部变量y具有值为20,因此sum = 1+20+100=121。
13. finally
不管try后语句是否发生异常,永远运行finally后的代码。
14. for
针对物件集合执行循环。
15. from
从特定模块中导入特定部分。
from A import x
16. global
声明全局变量。如果想在函数内部调用一个全局变量,必须用global进行声明,使得在该代码块内可以调用这个全局变量具有的值,而无需作为参数传入。
例如,以下运行会报错
1 count = 1
2
3 def func():4 count +=1
5 print(count)
6
7 func()
Traceback (most recent call last):
File "ex37.py", line 7, in <module>
func()
File "ex37.py", line 4, in func
count +=1
UnboundLocalError: local variable 'count' referenced before assignment
因为在func中count为局部变量,它没有被赋值。
将count声明为全局变量后程序顺利运行:
1 count = 1
2
3 def func():
4 global count
5 count +=1
6 print(count)
7
8 func()
输出结果为 2。
应注意,尽管声明只在当前函数内有效,但函数内部对全局变量的值的修改是会传递到函数外的,因此才叫“全局”变量。
17. if
if条件语句。
18. import
导入模块。
19. in
for循环的一部分;或作为x是否在y中的条件判断。
1 a = [1,2,3]
2 b = 4 in a
3 c = 1 in a
4 print(b, c)
输出为 False True。
20. is
类似于==,用于判断真假。
21.lambda
创建短匿名函数。
lambda的主体只是一个表达式,它比def的函数体要简单许多,它的表达式中只能封装有限的逻辑。
lambda函数有自己的命名空间,不能访问自身参数表意外的参数,也不能访问全局空间的参数。
其函数语法只包含一个语句,如下
lambda [arg1 [, arg2,...argn]]: expression
一般用法如下
1 difference = lambda x1, x2: x1-x2
2 print(difference(20, 10))
22. not
逻辑非
23. or
逻辑或
24. pass
表示空代码块。
例如
1 def emptyfunc():
2 pass
用于定义一个空函数,有时在函数定义时没有想好函数的功能,可以先用pass占位,使得整个程序可以顺利执行。
25. print
打印字符串等。
26. raise
用于抛出用户自定义异常,例如
raise ErrorType('Your prompt here.')
其中,ErrorType必须是一个异常的实例或异常的类(也就是exception的子类)
27. return
返回值并退出函数。
28. try
用于try...except...else...finally语句,检查程序异常。
29. while
while循环。
30. with
用于with...as...语句。
31. yield
暂停函数,返回到调用函数的代码块中。
【联】python中的生成器(generator)
生成器是一个返回迭代器的函数,它和普通函数最重要的区别在于含有yield语句。生成器的使用可以有效的节约系统资源,避免不必要的内存占用。
参考:python yield使用浅析 python yield用法总结
例如
1 def func():
2 a = 10
3 yield a
4 print(a)
5
6 func().__next__()
其中,如果采用书上写法func().next()会报以下错误:
‘generator’ object has no attribute ‘next’
这是因为python3中生成器中的next变为了__next__,next是以前的版本的写法。
二、数据类型
1.True
布尔值“真”。
2. False
布尔值“假”。
3. None
表示“不存在”或“没有值”
注意,None也可以作为列表的合法元素,例如
1 list = [1,2,3,None,[],{},()]
2 print(len(list))
其输出结果为 7。因为None、[]、{}、()都是合法元素。
4. bytes
字节串存储,可能是文本、PNG图片、文件等,如
1 x = b'hello'
2 print(type(x))
输出为
<class 'bytes'>
可见,bytes也是一种数据类型,当字符串前面加了b时,它的数据类型就不是string而时bytes了。
5. strings
存储文本信息。
6. numbers
存储整数。
7. Floats
存储十进制数。
8. lists
存储列表。使用[ ]括号。
9. dicts
存储键-值映射。使用{ }括号。
三、字符串转义序列
\\ 反斜杠
\' 单引号
\" 双引号
\a 响铃
\b 退格符
\f 表单填充符,翻页符
\n 换行符
\r 回车符
\t 制表符
\v 垂直制表符
四、老式字符串格式
python 2使用这些格式化字符实现f-string的功能,如
1 a = 10.23
2 print('hello %d world'%(a))
输出为
hello 10 world
%d 十进制整数
%i 同%d
%o 八进制数
%u 无符号整数
%x 小写十六进制数
%X 大写十六进制数
%e 指数表示,小写e
%E 指数表示,大写E
%f 浮点实数
%F 同%f
%g %f和%e中较短的一种
%G 同%g,大写
%c 字符格式
%r Repr格式(调试格式)
%s 字符串格式
%% 百分号本身
五、运算符
** 幂运算
/ 除
// 除后向下取整
% 字符串翻译,或求余数
@ 修饰器符
修饰器符@必须在它修饰的函数def之后使用,解释器读到修饰器符@后,会先解析@后面的内容,并把下一行的函数/类作为@后面的函数的参数,然后将返回值赋给下一行修饰的函数的对象,如
1 def a(m): 2 s = m(5) + 1 3 print(s) 4 5 @a 6 def c(n): 7 n = n * 2 8 print(n) 9 return n
输出为
10 11
注意,@的作用对象包括本行内紧跟@之后的函数(上面的a),也包括下一行的函数(上面的c),前者是被修饰的,后者是用于修饰的。
语句执行时,先解析@后语句,即函数a,将函数c赋值给函数a的形参m(并不是将c的返回值赋给a的形参,也就是说m的type是function,而不是int),再将实参5赋给函数c的形参n,函数c被调用,因此打印出值10,其返回值参与函数a中运算,并打印值11。