一些有意思的Python语法特性
Python支持许多比较有意思
的语法,这里列举了部分内容。
切片
# TODO:切片
list_num = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
print(list_num[-2:]) # 17 18
print(list_num[:3]) # 0, 1, 2
print(list_num[::2]) # 0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
列表生成式
# TODO:列表生成式
list_num = [x * x for x in range(10)]
print(list_num) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
生成器
有时使用列表生成式生成较大列表时会浪费空间,此时可以使用生成器
# TODO:生成器
list_num = (x * x for x in range(10))
print(next(list_num)) # 0
print(next(list_num)) # 1
print(next(list_num)) # 4
生成器函数
生成器函数只有"实例化"一个后才可以配合多层yield
,否则都只会到达第一层yield
# TODO:生成器函数 gererator
def fun():print("step 1")yield 1print("step 2")yield 2print("step 3")yield 3
f = fun
print(next(f())) # step 1
print(next(f())) # step 1
f = fun() # "实例化"函数
print(next(f)) # step 1
print(next(f)) # step 2
Lambda表达式
简化函数书写
# lambda 参数 : 函数逻辑
f = lambda x, y :print(x,y)
f(1, 2)
Python 推导式
name_list = ['zhangsan', 'lisi', 'wangwu']
x = 90
print(x) if x > 100 else print('<= 100')
_x = 10
print(_x)
# 类比嵌套 for loop
[print(ch) for name in name_list for ch in name if ch > 'h']
偏函数
提前固定某些函数的形参,类比于指定函数参数
def add(a, b = 1):return a + b# 这种方式更加的灵活,可以按需指定参数
add2 = functools.partial(add, b = 1)
print(add2(1), add(1))
Python 装饰器
用于包装函数,可以在运行函数的上下文中进行某些操作,例如打印日志等,同时为了避免修改函数的__name__
属性值,需要设置@functools.wraps(fun)
def log(fun):@functools.wraps(fun)def wrapper(*args, **kwargs):print('%s %s():' % (text, func.__name__))return func(*args, **kw)
def log(func):# wrapper 相当于包装后的 func@functools.wraps(func)def wrapper(*args, **kwargs):print("begin call")func(*args, **kwargs) # 此时会执行被包装的func函数print("end call")# return func(*args, **kwargs) # 如果return的话就是return函数执行结果return wrapper
# log(func) -->
@log
def fun(*args, **kwargs):print(f"args = {args}\n kwargs = {kwargs}")
fun(1, 2, 3, 4, 5, name='zhangsan', age = 18)
函数参数*args
与**kwargs
*args
就是一个参数列表,可以包含多个参数**kwargs
就是key-word
参数列表,包含多个字典(name='zhangsan', age = 18
)**kwargs
必须放置在最后
包管理
- python中的包管理和模块管理类似于Java和C++等编程语言库和头文件的概念
- 当python文件作为执行文件时,文件的
__name__
属性为__main__
,其余情况则为指定的__name__
变量值,这也就是为什么主函数代码会有if __name == '__main__'
这些代码,同时如果python文件是通过import
导入的,则不会执行if __name == '__main__'
的代码,同时python也支持pass
用于函数占位,什么也不执行。 - python模块中通过给
__all__
变量赋值,来设置引用该模块的文件可以访问本文件内容的范围 - 。。。
待补充。。
- map:对列表元素执行指定函数
- filter:返回
bool
值 - 迭代器
- …