现在写代码,都是在一个文件中·编写代码。当写的代码越来越多的时候,不同的功能代码都放在一起,容易引起混淆。
要将相同的功能的代码封装在一起,可以放在函数中。
定义函数
定义函数的基本语法
def 函数名():
函数执行体
定义函数。
# 定义函数
def sayHello():
# 函数执行体
for i in range(10):
print("hello")
# 函数需要调用才能执行
sayHello()
执行可以看到结果。
函数的参数
必填参数
上面的例子中,sayHello函数默认打印10次。不够灵活,我们希望,在调用函数的时候,可以执行10次,也可以执行1次,还可以执行100次。灵活配置。
可通过设置参数来实现。
# 定义函数 n 表示参数
def sayHello(n):
# 函数执行体
for i in range(n):
print("say hi hello")
# 函数需要调用才能执行,调用的时候,一定要传参
sayHello(20)
执行因为传入参数为20,所以执行20次数。
定义函数如果是必填的,调用的时候一定要传值。
默认值参数
上面的例子中在调用函数的时候必须要传入参数,如果某些业务需求有默认,可以在函数定义的时候添加默认值。
# 带有默认值参数的函数
def say_myself(name, city="上海"):
print(f"我的名字是{name},来自{city}")
# 使用默认值
say_myself("王大锤") # 我的名字是王大锤,来自上海
# 覆盖默认值
say_myself("张铁柱","北京") # 我的名字是张铁柱,来自北京
# 传参的时候也可以指定参数名
say_myself(name="小明") # 我的名字是小明,来自上海
say_myself(city="广州",name="小红") # 我的名字是小红,来自广州
如果函数中有 必填参数,也有默认值参数,定义函数的时候,必填参数放在前面,默认值参数放在后面。
下面这样定义函数会报错。
*args 传参 (元组)
定义函数的时候,如果参数比较多。举个例子,定义函数 自我介绍,自我介绍的时候说一下自己的爱好,爱好不同的人有不同的爱好,也有可能有很多爱好。
# *hobby 表示可以传0个或者多个参数值
def say_myself(name,*hobby):
print(type(name), type(hobby))
print(f"我的名字是: {name}, 我的爱好: {hobby}")
for h in hobby:
print(f"我爱好{h}")
say_myself("xiaoming")
say_myself("小王","学习","运动","上班")
函数的参数前面加 * 表示参数是可以传也可以不传。 传的值最终在执行体中都会变成 元组数据格式。
**kwargs传参(字典)
还是自我介绍的例子,我们在介绍的时候,除了介绍自己的爱好,也可以自我发挥一下。
# *hobby 表示可以传0个或者多个参数值, **others 表示传入值会放在字典。
def say_myself(name,*hobby,**others):
print(type(name), type(hobby), type(others))
print(name,hobby,others)
say_myself("xiaowang") # xiaowang () {}
# 给字典传值
say_myself("小王",salay="10k",home="油矿")
# 元组,字典都进行传值
say_myself("小王","跑步","学习",age=25,workyear=3)
参数的位置
当函数里面有 必填参数,又有默认值参数,还有 可变长度的元组,还有 *字典类型的数据的时候。定义函数时候需要注意位置:
# *hobby 表示可以传0个或者多个参数值, **others 表示传入值会放在字典。
def say_myself(name, *hobby,city="上海",**others):
print(f"我的名字是{name},来自{city}")
print(f'我的爱好{hobby}')
print(f'我的其他{others}')
say_myself("xiaowang")
say_myself("xiaowang",city="beijing")
say_myself("小王","学习")
say_myself("小王",home="铀矿")
函数的返回值return
在项目中,可以根据业务需求可以 创建很多函数,有些函数之间是有关联的。函数的运算结果需要在别的函数中有使用到,这里需要使用到return返回值。
import random
def login():
token = random.randint(0,999999999999) # 生成的token值
print(f'登录成功,获取token{token}')
# 添加返回值
return token # token值在其他地方有用, 将token return 出来
def order():
# 获取token 调用登录函数
token = login() # 因为login 有返回值,可以调用。
print(f"使用token{token}进行下单")
order()
函数return
使用函数return返回值的时候,一个函数只能return 一次。
return多次,最终也只是取return最前面的值。
def f1():
return "你好!" # 函数return
return "OK" # 这一句就不再执行了
f = f1()
print(f)
如果想要 将 上面代码中的 “你好!”,”OK” 都return出来。
def f1():
return "你好!","OK"
f = f1()
print(f)
函数中的参数类型
为了写代码的时候,pycharm 可以加代码提示。
但是如果写的函数中不知道参数的类型是什么,就没有提示。
如果我们知道x的类型,就可以进行相关的提示。
参数指定类型
做一个自我介绍的函数,name为字符串,并且将字符串都转换为大写。
# 声明name的类型
def myself(name:str):
# 将name转换为大写
username = name.upper() # 写代码的时候有提示
print(f"my name is {username}")
myself("tom")
返回结果指定类型
针对函数的返回结果指定类型
# 指定函数的返回结果类型为 列表
def f() -> list:
pass
下面在调用的时候,可以看到对应的代码提示。