Python-03-结构和函数
=
赋值语句有个比较特殊的用法就是,一句话对多个变量同时赋值:a,b=b,a
使用逗号分割要赋值的元素,这个就实现了元素交换了。
而实现这样是,Python 把两边都当作元组来处理了…… 也就是 (a,b) 和 (b,a) 。
if-else
代码格式:
1 | if 表达式 1: |
真假判断
对于 Python 来说,除了 True 和 False 以外,其他类型也可以用于决定真假。
数字:0 0.0 为假,其他的为真。
字符串:空字符的时候为 False,又字符为真。
其他类型,None 是为假,其他的时候为真。
pass
Python 提供了一种用于占位,但是什么都不执行的语句 pass
(这是因为 Python 没有大括号,所以有些分支需要暂时不写代码的时候,用 pass 填充)
assert
断言,后面跟着一个表达式,当表达式为假的时候,抛出异常。来保证程序符合预期的运行。
assert EXPRESSION , NOTE
EXPRESSION 表示表达式,用来返回 Bool 值,NOTE 是注释,抛出异常的时候会随着注释一起出来,NOTE 可以不写。
where
while 的格式:
1 | while 条件表达式: |
for
Python 的 for 只支持增强循环,格式为:
1 | for 迭代变量 in 序列: |
这里一般使用 range(start,end) 来控制遍历次数,会返回一个 [start,end)
范围的 range 类型,start 可以不写,默认为 0.
zip()
当要同时遍历多个序列的时候,就可以使用函数 zip(a,b,c)
来将三个序列同一个下标的元素和合并成一个元组,然后元组集合组成一个 zip 类型,可以通过遍历 zip 类型来实现同时遍历多个序列:
1 | a = [1, 2, 3, 4] |
然后输出:
1 | (1, 5, 9) |
reversed(obj)
对于 list 来说,可以调用自己的 list.reverse() 将自己倒置一下。
但是不可变类型的序列来说,就没有办法修改自己了,因此引入了 reversed(obj)
方法。会返回一个倒置的自己,不过类型是 reversed 类型。可以遍历,想要改变的话,还是类型转换一下。
sort(obj)
和上面的那个一样,都是为了解决不可变类型的序列的。传入序列,返回一个排好序的列表(因为排序算法只能用列表实现嘛),格式:
1 | list = sorted(iterable, key=None, reverse=False) |
注意这里,key 传入的是一个 lambda 表达式,用于决定如何排列里面的元素。
函数
Python 的函数定义格式如下:
1 | def 函数名(参数列表): |
函数名 本质上就是一个变量,里面存储着函数的地址。
参数
对于 Python 函数的参数来说,主要有以下需要注意的点:
- Python 中的所有参数传递都是引用传递。
- 可以使用关键词来传递参数,这样就不用记忆形参的位置了:
例子:
1 | def get_name(first_name,last_name): |
- 可以设置参数默认值,不过需要写在所有无默认值参数的后面,需要注意的是:参数默认值无法限制参数的类型:
1 | def get_name(first_name,last_name,sex="man",high=10): |
可设置参数提示,格式 参数名 : 类型名
主要是给编辑器和程序员看的。
1 | def set_name(name:str) |
返回值
Python 的返回值可以返回多个参数,用逗号分割开来,会自动打包成一个元组。
1 | def get_name(first_name, last_name): |
输出的内容就是一个元组。
Python 支持返回值提示,格式 def func_name() -> 返回类型
1 | def get_name(self) -> str : |
函数作用域
全局变量
Python 的全局变量只要在函数外面声明就可以了。
- 在函数内部可以随意访问全局变量的值,但是不能赋值修改,因为一旦赋值就等于创建了一个新的,和全局变量重名的局部变量。如果想要赋值全局变量的话,有两种方法:
globals()[var_name] = XXX
来获取全局变量的地址,从而完成修改。另外一个就是单独声明一下这个全局变量,就是加上 global 这个关键字(注意不能赋值,只单独声明),然后后面对这个全局变量进行赋值就不是创建一个新的局部变量,而是操作全局变量了。
局部函数
可以在函数内部实现局部函数,也就是只有在函数内部调用的函数。函数名本质上就是存储指针地址的变量。这个变量的作用域也就是函数能调用的作用域。
当把这个函数的地址传递出去,让外界拿到函数的地址,也就是扩大了函数的作用域。
函数闭包
就是将函数的处理进行分阶段,第一阶段处理之后,返回一个新的函数,调用新函数处理第二阶段。
Lambda
用于元素生成一个 Callable 的函数,格式:name = lambda [list] : 表达式
其中 [list]
表示可选参数,里面是用来描述形参列表的,可以不写:
1 | hello = lambda : "hello" |
1 | x = lambda a, b : a * b |
获取可操作变量
globals() 以字典的形式返回所有的全局变量。
locals() 返回当前作用域所支持的所有变量,也是字典。
vars(obj) 返回对象中类的所有属性。
eval() exec()
eval(expression,globals=None,locals=None)
exec(code,globals=None,locals=None)
都是输入字符串,然后执行,其中 eval 执行的是单个表达式,exec 可以执行复杂的代码块。其次 eval 执行完表达式之后会返回表达式的值。
对于 globals 表示的是可以使用的全局命名空间, locals 表示的是可以使用的局部命名空间。这两个东西因为了解的不是太多,所以具体使用以后再说。
函数式编程
Python 内置了用于实现函数式编程的函数,下面的 obj 内容必须是序列:
map(func,obj...)
对于序列 obj 的每一个元素,都执行 func 函数得到结果,然后将结果封装为类 list 类型的 map 类型返回。如果 func 函数有多个输入参数,那么就需要多个序列 obj1,obj2 。filter(func,obj...)
这个 func 需要返回 Bool 类型,只有为 True 的序列元素输入,会被封装返回。如果输入多个参数(跟着多个 obj 序列输入),那么最后只输出对应输入的 Bool 值。
可变参数
*args : arguments
**kwargs : keyword arguments
固定格式是这样的:Func(*args,**kwargs)
args 用元组保存直接传递进来的实参,kwargs 用字典保存使用 key=value
传进来的实参。
然后将保存到 序列 里面的实参进行分析使用即可。
1 | # 定义了支持参数收集的函数 |
输出内容:
1 | C语言中文网 |