条件
1 | if cond: |
循环方式: while 循环, for 循环
1 | while cond: |
1 | for item in str/list/tuple/set/dict/dict.keys()/dict.values()/dict.items(): |
推导式
三元操作符:
x if cond else y
列表推导式:
[expr for item in var]
- 基本形式
[x*x for x in range(1,20)
- 带if条件
[x*x for x in range(1,20) if x%2 == 0]
- 带if-else条件
[x*x if x%2 == 0 else -x for x in range(1,20)]
- 多重循环
[x+y+z for x in "123" for y in "456" for z in "789"]
- 基本形式
集合推导式:
[]
换成{}
字典推导式:
{k: v for xx in yy}
函数
功能的封装, 代码的复用
函数的基本结构
1
2
3
4
5
6
7
8
9
10# 空2行
def func_name([params tuple]):
"""doc str
...
"""
# func body
[return expr]
# 空2行返回值, 与返回值 tuple 解构
1
2v = func_name()
v1, v2 = func_name()参数的使用: 形参 vs 实参
- 位置参数: 按位置顺序传参
func(v)
- 关键字参数: 给定参数key
func(k=v)
- 可变tuple参数: 定义
func(*args)
,args
是元组类型, 调用方法func(a, b, ..)
或func(*list)
- 可变dict参数: 定义
func(**kwargs)
,kwargs
是字典类型, 调用方法func{k1=v1, k2=v2, ..}
或func(*dict)
- 位置参数: 按位置顺序传参
参数的引用传递
参数传递以引用的方式传递, ps: NodeJS 和 Go 都是值传递, 在传递复杂类型的时候, 传递的是复杂类型指针的值, 实现了引用传递.
- 可变对象更改直接影响原值
- 不可变对象赋值会断开原引用, 创建新的对象
作用域
- 函数内部变量使用
global
提升为全局变量 - 函数内部变量与全局变量不冲突时(在函数内没有声明,赋值), 在函数内可以直接使用全局变量的值, 但是不使用
global
提权的情况下修改不对全局变量生效(一旦有修改,就相当于定义了局部变量, 与全局有冲突了)
- 函数内部变量使用
匿名函数 lambda
f = lambda params: expr
eg: sorted(var, key=lambda x: len(x))
eg: iter = map(lambda x: x*x, list/tuple/dict.values())装饰器函数
1
2
3
def value(self):
return self._v1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28# 需要一个wrapper功能
def wrapper(fn):
st = time.time()
fn()
ed = time.time()
print("elapse", ed - st, "s")
wrapper(fn)
# 对 wrapper 功能封装
def timer(fn):
def wrapper():
st = time.time()
fn()
ed = time.time()
print("elapse", ed - st, "s")
return wrapper
timer(fn)()
# 封装后赋值给 原函数名 实现无感封装
fn = timer(fn)
fn()
# 或者直接使用装饰器
def fn():
pass