现在写代码,都是在一个文件中·编写代码。当写的代码越来越多的时候,不同的功能代码都放在一起,容易引起混淆。
要将相同的功能的代码封装在一起,可以放在函数中。

定义函数

定义函数的基本语法

  1. def 函数名():
  2. 函数执行体

定义函数。

  1. # 定义函数
  2. def sayHello():
  3. # 函数执行体
  4. for i in range(10):
  5. print("hello")
  6. # 函数需要调用才能执行
  7. sayHello()

执行可以看到结果。
image.png

函数的参数

必填参数

上面的例子中,sayHello函数默认打印10次。不够灵活,我们希望,在调用函数的时候,可以执行10次,也可以执行1次,还可以执行100次。灵活配置。
可通过设置参数来实现。

  1. # 定义函数 n 表示参数
  2. def sayHello(n):
  3. # 函数执行体
  4. for i in range(n):
  5. print("say hi hello")
  6. # 函数需要调用才能执行,调用的时候,一定要传参
  7. sayHello(20)

image.png
执行因为传入参数为20,所以执行20次数。
定义函数如果是必填的,调用的时候一定要传值。

默认值参数

上面的例子中在调用函数的时候必须要传入参数,如果某些业务需求有默认,可以在函数定义的时候添加默认值。

  1. # 带有默认值参数的函数
  2. def say_myself(name, city="上海"):
  3. print(f"我的名字是{name},来自{city}")
  4. # 使用默认值
  5. say_myself("王大锤") # 我的名字是王大锤,来自上海
  6. # 覆盖默认值
  7. say_myself("张铁柱","北京") # 我的名字是张铁柱,来自北京
  8. # 传参的时候也可以指定参数名
  9. say_myself(name="小明") # 我的名字是小明,来自上海
  10. say_myself(city="广州",name="小红") # 我的名字是小红,来自广州

如果函数中有 必填参数,也有默认值参数,定义函数的时候,必填参数放在前面,默认值参数放在后面。
下面这样定义函数会报错。
image.png

*args 传参 (元组)

定义函数的时候,如果参数比较多。举个例子,定义函数 自我介绍,自我介绍的时候说一下自己的爱好,爱好不同的人有不同的爱好,也有可能有很多爱好。

  1. # *hobby 表示可以传0个或者多个参数值
  2. def say_myself(name,*hobby):
  3. print(type(name), type(hobby))
  4. print(f"我的名字是: {name}, 我的爱好: {hobby}")
  5. for h in hobby:
  6. print(f"我爱好{h}")
  7. say_myself("xiaoming")
  8. say_myself("小王","学习","运动","上班")

函数的参数前面加 * 表示参数是可以传也可以不传。 传的值最终在执行体中都会变成 元组数据格式。

**kwargs传参(字典)

还是自我介绍的例子,我们在介绍的时候,除了介绍自己的爱好,也可以自我发挥一下。

  1. # *hobby 表示可以传0个或者多个参数值, **others 表示传入值会放在字典。
  2. def say_myself(name,*hobby,**others):
  3. print(type(name), type(hobby), type(others))
  4. print(name,hobby,others)
  5. say_myself("xiaowang") # xiaowang () {}
  6. # 给字典传值
  7. say_myself("小王",salay="10k",home="油矿")
  8. # 元组,字典都进行传值
  9. say_myself("小王","跑步","学习",age=25,workyear=3)

执行
image.png

参数的位置

当函数里面有 必填参数,又有默认值参数,还有 可变长度的元组,还有 *字典类型的数据的时候。定义函数时候需要注意位置:
Python 函数 - 图5

  1. # *hobby 表示可以传0个或者多个参数值, **others 表示传入值会放在字典。
  2. def say_myself(name, *hobby,city="上海",**others):
  3. print(f"我的名字是{name},来自{city}")
  4. print(f'我的爱好{hobby}')
  5. print(f'我的其他{others}')
  6. say_myself("xiaowang")
  7. say_myself("xiaowang",city="beijing")
  8. say_myself("小王","学习")
  9. say_myself("小王",home="铀矿")

函数的返回值return

在项目中,可以根据业务需求可以 创建很多函数,有些函数之间是有关联的。函数的运算结果需要在别的函数中有使用到,这里需要使用到return返回值。
Python 函数 - 图6

  1. import random
  2. def login():
  3. token = random.randint(0,999999999999) # 生成的token值
  4. print(f'登录成功,获取token{token}')
  5. # 添加返回值
  6. return token # token值在其他地方有用, 将token return 出来
  7. def order():
  8. # 获取token 调用登录函数
  9. token = login() # 因为login 有返回值,可以调用。
  10. print(f"使用token{token}进行下单")
  11. order()

函数return

使用函数return返回值的时候,一个函数只能return 一次。
return多次,最终也只是取return最前面的值。

  1. def f1():
  2. return "你好!" # 函数return
  3. return "OK" # 这一句就不再执行了
  4. f = f1()
  5. print(f)

image.png
如果想要 将 上面代码中的 “你好!”,”OK” 都return出来。

  1. def f1():
  2. return "你好!","OK"
  3. f = f1()
  4. print(f)

image.png

函数中的参数类型

为了写代码的时候,pycharm 可以加代码提示。
image.png
但是如果写的函数中不知道参数的类型是什么,就没有提示。
image.png
如果我们知道x的类型,就可以进行相关的提示。
image.png

参数指定类型

做一个自我介绍的函数,name为字符串,并且将字符串都转换为大写。

  1. # 声明name的类型
  2. def myself(name:str):
  3. # 将name转换为大写
  4. username = name.upper() # 写代码的时候有提示
  5. print(f"my name is {username}")
  6. myself("tom")

返回结果指定类型

针对函数的返回结果指定类型

  1. # 指定函数的返回结果类型为 列表
  2. def f() -> list:
  3. pass

下面在调用的时候,可以看到对应的代码提示。
image.png