函数
"""
先定义后调用(函数名+括号)
函数名的命名规则跟变量名一样
函数在定义的时候只检测函数体语法,不执行函数体代码
函数名遇到括号会立即执行函数体代码
"""
def func():
pass
def func():
print('hello world')
def func(x, y, *args, **kwargs):
print('hello world')
def index():
pass
...
函数返回值 return
"""
函数内要想返回值给调用者,必须用关键字return,函数体遇到return直接结束整个函数的运行
所有的函数都有返回值,不写默认返回None
光写return或return None并不是为了考虑返回值,而是为了结束函数的运行
"""
def func():
l = ['jason', 'egon', 'tank']
while True:
for i in l:
if i == 'egon':
return
print('abcdefg')
print(i)
def func1():
return 1, 2, 3, 4
print(func())
def func2():
return 'a', 'b', 'c'
print(func2())
def func3():
return [1, 2], [1, 3], [2, 3]
print(func3())
def func4():
return {'name': 'jason'}, {'age': '18'}
print(func4())
def func5():
return [[1, 2], [1, 3], [2, 3]]
print(func5())
函数参数
"""
函数参数的两大类型:
形参: 在函数的定义阶段,括号内写的变量名,叫做该函数的形式参数,简称形参
实参: 在函数的调用阶段,括号内实际传入的值,叫做实际参数,简称实参
形参与实参的关系:
形参就相当于变量名,而实参就相当于变量的值
函数调用传参的过程,就是给形参赋值的过程
注意: 形参和实参的绑定关系只在函数的调用阶段有效,函数运行结束关系自动解除,只在函数内部有效,函数外部无任何影响
函数的简易结构:
def 函数名(形参1,形参2...):
'''函数的注释,用来描述该函数的作用以及各个形参的类型和return返回值'''
函数体代码1
函数体代码2
...
return 函数的返回值
"""
def func(x, y):
"""
该函数的作用
: param x: 对形参x的解释
: param y: 对形参y的解释
: return: 对函数返回值的解释
"""
print('hahaha')
return 'heihei'
print(help(func))
位置参数
"""
位置形参: 在函数定义阶段按照位置从左往右依次书写的变量名,位置形参在调用的时候,必须为其传值,有几个传几个
位置实参: 在函数的调用阶段
位置传参: 直接按照位置传,一一对应
关键字传参: 指名道姓的传
注意: 在函数的调用阶段,位置传参和关键字传参可以混合使用,但是必须保证
1.位置传参必须在关键字传参的前面
2.同一个形参不能被多次赋值
"""
def my_max(x,y):
print(x,y)
if x > y:
return x
else:
return y
print(my_max(1,3))
print(my_max(1))
print(my_max(1,2,3))
print(my_max(y=20,x=10))
print(my_max(10,y=20))
默认值参数
"""
默认值参数: 在函数的定义阶段,形参(变量名)就已经被赋值了
在调用的时候可以不为默认值形参传值,默认使用定义阶段就已经绑定的值
在调用的时候如果给默认值形参传值,那么就使用你传的值
在定义阶段,默认值形参必须放在位置形参的后面
函数在定义阶段,内部所使用的变量都已经初始化完毕了,不会因为调用位置变化,而影响到内部的值(暂时可忽略)
函数无论在什么地方被调用,都会跑到函数定义阶段去执行代码,形参中用到的值都是往函数定义阶段代码之上找
"""
def my_max(x,y=100):
if x > y:
return x
return y
print(my_max(200))
print(my_max(200,1000))
def info(username,hobby,l=[]):
l.append(hobby)
print('%s 的爱好是 %s'%(username,l))
info('jason','read')
info('tank','study')
info('jason','read',[])
info('tank','study',[])
def info(username,hobby,l=None):
if l == None:
l = []
l.append(hobby)
print('%s 的爱好是 %s'%(username,l))
info('jason','read')
info('tank','study')
可变长参数
"""
用*和**来接收多余的(溢出的)位置参数和关键字参数
*在形参中能够接受多余的位置参数,组织成一个元祖赋值给*后面的变量名
**在形参中能够接受多余的关键字参数,组织成一个字典赋值给**后面的变量名
*在实参中能够将、列表、元祖、集合打散成位置实参的形式传递给函数,*就看成是for循环取值
**在实参中能够将字典打散成key=value的形式按照关键字参数传递给函数
"""
def func(x,y,*z):
print(x,y,z)
func(1,2,3,4,5,6)
def func(x,y,z):
print(x,y,z)
func(*[1,2,3])
def func(x,*z):
print(x,z)
func(1,*{1,2,3})
def func(x,y,**z):
print(x,y,z)
func(1,2,a=1,b=2,c=3)
func(x=1,y=2,a=1,b=2,c=3)
def func(x,y,z):
print(x,y,z)
func(**{'x': 1,'y': 2,'z': 3})
def func1(*x,**y):
print(x,y)
func1(1,2,x=1,y=2,z=3)
def func2(*args,**kwargs):
print(args,kwargs)
命名关键字参数
def func(x,y=1,*args,z=3,m,**kwargs):
print(x,y)
print(args)
print(z,m)
print(kwargs)
func(1,2,1,2,3,z=69,m=999,o=666999,l=999666)
函数对象
def func():
print('from func')
print(func)
f = func
print(f)
def func():
print('from func')
def index(args):
print(args)
args()
index(func)
def index():
print('index')
def func():
return index
res = func()
print(res)
res()
def func():
return 'func'
l = [1,2,func,func()]
print(l)
def register():
print('register ...')
def login():
print('login ...')
def transfer():
print('transfer ...')
msg = """
1 注册
2 登陆
3 转账
"""
func_dict = {
'1': register,
'2': login,
'3': transfer,
}
while True:
print(msg)
choice = input('请输入你想执行的功能>>>: ').strip()
if choice in func_dict:
func_dict.get(choice)()
else:
print('输入错误')
函数的嵌套调用
def index():
print('index')
def func():
index()
func()
def my_max(x,y):
if x > y:
return x
return y
def my_max4(a,b,c,d):
res1 = my_max(a,b)
res2 = my_max(res1,c)
res3 = my_max(res2,d)
return res3
print(my_max4(1,2,10,4))
函数的嵌套定义
def outer():
x = 1
print('outer')
def inner():
print('inner')
outer()
print(x)
print(inner)
def outer():
x = 1
print('outer')
def inner():
print('inner')
inner()
outer()
def outer():
x = 1
print('outer')
def inner():
print('inner')
return inner
res = outer()
print(res)
res()
def all_funx(type):
def register():
print('register')
def login():
print('login')
def shopping():
print('shopping')
if type == '1':
register()
elif type == '2':
login()
elif type == '3':
shopping()
all_funx('1')
闭包函数
def outter():
x = 111
def inner():
print(x)
return inner
res = outter()
x = 222
res()
def func():
x = 333
res()
func()
def index(name):
print(name)
def outter(x,y):
def my_max():
if x > y:
return x
return y
return my_max
res1 = outter(1,40)
print(res1())
import requests
def my_get(url):
response = requests.get(url)
if response.status_code == 200:
print(response.text)
my_get('https: //www.baidu.com')
def outter(url):
def my_get():
response = requests.get(url)
if response.status_code == 200:
print(response.text)
return my_get
my_jd = outter('https: //www.jd.com')
my_jd()
装饰器
装饰器
"""
装饰器: 给被装饰对象添加新的功能的工具
开放封闭原则:
开放: 对扩展开放
封闭: 对修改封闭
装饰器必须遵循的两个原则:
1.不改变被装饰对象源代码
2.不改变被装饰对象调用方式
"""
import time
def index():
time.sleep(3)
print('结束啦')
def outter(func):
def get_time():
start = time.time()
func()
end = time.time()
print('index run time: %s'%(end-start))
return get_time
index = outter(index)
index()
"""
函数参数的问题:
无参函数和有参函数都可以直接调用
函数可以接收任意数量的参数
能返回之前函数的返回值
"""
import time
def index():
time.sleep(3)
print('结束啦')
return 'index'
def login(name):
time.sleep(1)
print('%s is sb'%name)
return 'login'
def outter(func):
def get_time(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
end = time.time()
print('func run time: %s'%(end-start))
return res
return get_time
login = outter(login)
res = login('egon')
print(res)
index = outter(index)
res1 = index()
print(res1)
装饰器语法糖
import time
def outter(func):
def get_time(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
end = time.time()
print('func run time: %s'%(end-start))
return res
return get_time
@outter
def index():
time.sleep(3)
print('结束啦')
return 'index'
@outter
def login(name):
time.sleep(1)
print('%s is sb'%name)
return 'login'
@outter
def home(*args,**kwargs):
time.sleep(1)
return 'home'
index()
login('egon')
home()
import time
user_dic = {'is_login': None}
def login_auth(func):
def inner(*args,**kwargs):
if user_dic['is_login']:
res = func(*args, **kwargs)
return res
else:
username = input('please input your username>>>: ').strip()
password = input('please input your password>>>: ').strip()
if username == 'jason' and password == '123':
user_dic['is_login'] = True
res = func(*args,**kwargs)
return res
else:
print('username or password error')
return inner
@login_auth
def index(name):
time.sleep(1)
print('%s is dsb'%name)
return 666
index('egon')
多层装饰器
import time
user_dic = {'is_login': None}
def outter(func):
def get_time(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
end = time.time()
print('func run time: %s'%(end-start))
return res
return get_time
def login_auth(func):
def inner(*args,**kwargs):
if user_dic['is_login']:
res = func(*args, **kwargs)
return res
else:
username = input('please input your username>>>: ').strip()
password = input('please input your password>>>: ').strip()
if username == 'jason' and password == '123':
user_dic['is_login'] = True
res = func(*args,**kwargs)
return res
else:
print('username or password error')
return inner
@login_auth
@outter
def index():
time.sleep(1)
print('from index')
return 'index'
print(index())
import time
user_dic = {'is_login': None}
def outter(func):
def get_time(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
end = time.time()
print('func run time: %s'%(end-start))
return res
return get_time
def login_auth2(data_source,x,y):
def login_auth(func):
def inner(*args,**kwargs):
if user_dic['is_login']:
res = func(*args, **kwargs)
return res
else:
if data_source == 'file':
username = input('please input your username>>>: ').strip()
password = input('please input your password>>>: ').strip()
if username == 'jason' and password == '123':
user_dic['is_login'] = True
res = func(*args,**kwargs)
return res
else:
print('username or password error')
elif data_source == 'MySQL':
print('from MySQL')
elif data_source == 'LDAP':
print('from LDAP')
else:
print('暂无该数据来源')
return inner
return login_auth
@login_auth2('MySQL',1,2)
@outter
def index():
time.sleep(1)
print('from index')
return 'index'
index()
装饰器修复技术
"""
若没有用装饰器修复技术,则看被装饰器函数的内存地址、函数名和注释为装饰器内部函数的函数名和注释
装饰器修容技术可以解决:
用户查看被装饰函数的内存地址时就是被装饰函数的内存地址
用户查看被装饰函数的函数名时就是被装饰函数的函数名
用户查看被装饰函数的注释时就是被装饰函数的注释
"""
from functools import wraps
def outter(func):
@wraps(func)
def inner(*args,**kwargs):
"""
我是inner函数
: param args:
: param kwargs:
: return:
"""
print('执行被装饰函数之前 你可以执行的操作')
res = func(*args,**kwargs)
print('执行被装饰函数之后 你可以执行的操作')
return res
return inner
@outter
def index():
"""
我是index函数
: return:
"""
pass
print(index)
print(help(index))
print(index.__name__)
装饰器模板
from functools import wraps
def outter(func):
@wraps(func)
def inner(*args,**kwargs):
print('执行被装饰函数之前你可以做的操作')
res = func(*args,**kwargs)
print('执行被装饰函数之后你可以做到操作')
return res
return inner
@outter
def index(name,*args,**kwargs):
"""index注释"""
pass
def wrappers(data):
def outter(func):
def inner(*args,**kwargs):
if data == 'file':
print('执行被装饰函数之前你可以做的操作')
res = func(*args,**kwargs)
print('执行被装饰函数之后你可以做到操作')
return res
return inner
return outter
@wrappers('file')
def index(name,*args,**kwargs):
"""index注释"""
pass
递归函数
"""
函数在调用阶段直接或间接的又调用自身
递归分为两个阶段:
1.回溯: 就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度下降,直到最终的结束条件
2.递推: 一次次往回推导的过程
"""
import sys
print(sys.getrecursionlimit())
sys.setrecursionlimit(1000)
def func(n):
print('from func',n)
func(n+1)
func(1)
"""
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 18
age(n) = age(n-1) + 2 # n > 1
age(1) = 18 # n = 1
"""
def age(n):
if n == 1:
return 18
return age(n-1) + 2
print(age(5))
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,]]]]]]]]]]
def get_num(list):
for i in list:
if type(i) is int:
print(i)
else:
get_num(i)
get_num(l)
l = [1,3,5,12,57,89,101,123,146,167,179,189,345]
num = 666
def get_num(list,target_num):
if not list:
print('列表不存在')
return
print(list)
middle_index = len(list) // 2
if target_num > list[middle_index]:
num_right = list[middle_index + 1: ]
get_num(num_right,target_num)
elif target_num < list[middle_index]:
num_left = list[0: middle_index]
get_num(num_left, target_num)
else:
print('find it',target_num)
get_num(l,num)
匿名函数
"""
没有名字的函数,临时存在用完就没了
lambda x,y: x+y
: 左边相当于函数的形参
: 右边相当于函数的返回值
匿名函数通常不会单独使用,而是配合内置函数一起使用
"""
res = (lambda x,y: x+y)(1,2)
print(res)
func = lambda x,y: x+y
print(func)
print(func(1,2))
常用的内置函数
l = [1,2,3,4,5]
print(max(l))
d = {
'egon': 30000,
'jason': 88888,
'nick': 3000,
'tank': 1000
}
print(max(d))
"""
ASCII码
A-Z 65-90
a-z 97-122
"""
def index(name):
return d[name]
print(max(d,key=index))
print(max(d,key=lambda name: d[name]))
print(min(d,key=lambda name: d[name]))
l = [1,2,3,4,5]
print(list(map(lambda x: x+1,l)))
l1 = [1,2,3,4]
l2 = ['jason','egon','tank']
l3 = ['a','b',]
print(list(zip(l1,l2)))
print(list(zip(l1,l2,l3)))
l = [1,2,3,4,5]
print(list(filter(lambda x: x != 3,l)))
l1 = ['jason','egon','nick','tank']
l2 = [32,12,55,3,656,30]
print(sorted(l1))
print(sorted(l1,reverse=True))
print(sorted(l2))
print(sorted(l2,reverse=True))
chars=['http://c.biancheng.net',\
'http://c.biancheng.net/python/',\
'http://c.biancheng.net/shell/',\
'http://c.biancheng.net/java/',\
'http://c.biancheng.net/golang/']
print(sorted(chars,key=lambda x:len(x)))
from functools import reduce
l = [1,2,3,4,5]
print(reduce(lambda x,y: x+y,l))
print(reduce(lambda x,y: x+y,l,18))
print(abs(-11.11))
print(all([0,1,2]))
print(any([0,1,2]))
print(bool(1))
print(bool(0))
l = [1,2,3]
def index():
pass
print(callable(l))
print(callable(index))
print(chr(97))
print(ord('a'))
l = [1,2,3]
print(dir(l))
print(divmod(101,10))
s = """
print('hello baby~')
x = 1
y = 2
print(x + y)
"""
eval(s)
exec(s)
b = 5
def index():
a = 1
locals()['a'] = 2
globals()['b'] = 6
print(locals())
print(globals())
index()
def login():
"""
登入
: return:
"""
print(help(login))
print(isinstance(1,list))
print(pow(2,3))
print(round(3.5))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!