# encoding: utf-8
import functools
# ************************************************不定长参数************************************************
# def 函数名(*args):
# ************************************************************************************************
def my_tup(*args):
for v in args:
print(v)
my_tup(1, 2, 3, 4, 5)
# ************************************************不定长参数************************************************
# def 函数名(**kwargs):
# ************************************************************************************************
def my_dic(**kwargs):
print(kwargs, type(kwargs))
my_dic(name="admin", age=18)
# ************************************************引用传递************************************************
# pyhton中,只有引用传递,没有值传递
# 如果数据类型是可变类型,则可以改变原件
# 如果数据类型是不可变类型,则不可以改变原件
# ************************************************************************************************
def change(num):
num = 666
a = 20
change(a)
print(a)
# ************************************************偏函数************************************************
# 函数的某个参数偏爱使用某个值
# ************************************************************************************************
num_str = "100010"
result = int(num_str)
print(result)
# 今后的一段时间内
# 都需要把一段二进制字符串转换为十进制数据
int_2 = functools.partial(int, base=2)
print(int_2(num_str))
# ************************************************高阶函数************************************************
# 函数的一个参数可以接受另一个函数
# ************************************************************************************************
s = [{"name": "admin", "age": 18}, {"name": "admin", "age": 17}, {"name": "admin", "age": 16}]
def get_key(x):
return x["age"]
# 根据年龄排序该列表
print(sorted(s, key=get_key))
# ************************************************
def caculate(num1, num2, caculate_fun):
return caculate_fun(num1, num2)
def add(num1, num2):
return num1 + num2
def sub(num1, num2):
return num1 - num2
print(caculate(10, 5, add))
print(caculate(10, 5, sub))
# ************************************************返回函数************************************************
# 一个函数内部,它的返回值是另外一个函数
# ************************************************************************************************
def get_fun(flag):
# 定义两个函数
def add(num1, num2):
return num1 + num2
def sub(num1, num2):
return num1 - num2
# 根据不同的flag值,返回不同的函数
if flag == "+":
return add
elif flag == "-":
return sub
new_function = get_fun("+")
print(new_function(1, 2))
# ************************************************匿名函数************************************************
# 没有名字的函数,不能直接return
# 语法:lambda 参数1, 参数2... : 表达式
# 表达式就是返回值
# 只适用于一些简单的操作处理
# ************************************************************************************************
s = [{"name": "admin", "age": 18}, {"name": "admin", "age": 17}, {"name": "admin", "age": 16}]
# 根据年龄排序
print(sorted(s, key=lambda x: x["age"]))
# ************************************************闭包************************************************
# 在函数嵌套的前提下
# 内层函数引用了外层函数的变量
# 外层函数又把内层函数当做返回值进行返回
# 应用场景:外层函数根据不同的参数来产生不同功能的函数
# 注意事项:如果要修改引用的外部变量,需要使用nonlocal申明该变量
# 注意事项:当闭包内引用了一个后期会变化的变量时,一定要注意
# ************************************************************************************************
def test():
a = 10
def test2():
print(a)
return test2()
test()
# ************************************************
def out_fun():
num = 233
def in_fun():
# 使用nonlocal申明num
# 使外部num可被内部修改
nonlocal num
num = 666
print(num)
print(num)
in_fun()
print(num)
out_fun()
# ************************************************装饰器************************************************
# 在函数名以及函数体不变的前提下,给函数附加一些额外代码
# ************************************************************************************************
def check_submit(func):
def inner():
print("登录检查")
func()
return inner
@check_submit
def show_message():
print("hello word")
show_message()
# ************************************************
# 装饰器的叠加
def decorator_line(func):
def inner():
print("------------------")
func()
return inner
def decorator_star(func):
def inner():
print("******************")
func()
return inner
@decorator_line
@decorator_star
def show_message():
print("hello word")
show_message()
# ************************************************
# 装饰有参数的函数
def check_submit(func):
def inner(num1, num2):
print(num1 + num2)
func(num1, num2)
return inner
@check_submit
def show_message(num1, num2):
print(num1, num2)
show_message(1, 2)
# ************************************************
def check_submit(func):
def inner(*args):
print('-----')
func(*args)
return inner
@check_submit
def show_message(num1, num2, num3):
print(num1, num2, num3)
@check_submit
def show_message2(num1):
print(num1)
show_message(1, 2, 3)
show_message2(1)
# ************************************************
# 装饰器生成函数
def get_decorator(char):
def decorator(func):
def inner():
print(char * 10)
func()
return inner
return decorator
@get_decorator('-')
@get_decorator('*')
@get_decorator('x')
def show_message():
print("hello word")
show_message()
# ************************************************生成器************************************************
# 是一个特殊的迭代器(迭代器的抽象层级更高)
# 生成器只会遍历一次
# 如果碰到return会直接终止
# ************************************************************************************************
# ************************************************
# 生成器创建:生成器表达式
l = (i for i in range(1, 100) if i % 2 == 0)
for i in l:
print(i)
# ************************************************
# 生成器创建:生成器函数
def test():
yield 1
print('a')
yield 2
print('b')
yield 3
print('c')
yield 4
print('d')
g = test()
print(next(g))
print(next(g))
print(next(g))
# 关闭生成器
# print(g.close())
# print(next(g))
# ************************************************递归函数************************************************
# 函数内部继续调用该函数
# ************************************************************************************************
# ************************************************
# 求阶乘
def factorial(n):
if n == 1:
return 1
return n * factorial(n - 1)