python函数定义

一、python的函数

1、函数的作用

1)函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段
2)函数能提高应用的模块性和代码的重复利用率
3)python内置函数链接:https://docs.python.org/zh-cn/3.8/library/functions.html

2、函数定义

1)def:函数定义关键词
2)function_name:函数名称
3)():参数列表放置的位置,可以为空
4)parameter_list:可选,指定向函数中传递的参数
5)comments:可选,为函数指定注释
6)function_body:可选,指定函数体

3、定义函数的注意事项

1)缩进:python 是通过严格的缩进来判断代码块儿
    * 函数体和注释相对于 def 关键字必须保持一定的缩进,一般都是 4 个空格
    * pycharm 自动格式化快捷键:ctrl+alt+L
2)定义空函数
    * 使用 pass 语句占位
    * 写函数注释 comments

4、函数调用

1)function_name:函数名称
2)parameter_value:可选,指定各个参数的值
    function_name([parameter_value])

5、参数传递

1)形式参数:定义函数时,函数名称后面括号中的参数
2)实际参数:调用函数时,函数名称后面括号中的参数
  # a, b, c 为形式参数
def demo_func(a, b, c):
    print(a, b, c)

# 1, 2, 3 为实际参数
demo_func(1, 2, 3)

6、位置参数

1)数量必须与定义时一致
2)位置必须与定义时一致

def demo_func(a, b, c):
    print(a, b, c)

# 1 赋值给 a, 2 赋值给 b, 3 赋值给 c
demo_func(1, 2, 3)

7、关键字参数

1)使用形式参数的名字确定输入的参数值
2)不需要与形式参数的位置完全一致

def demo_func(a, b, c):
    print(a, b, c)

demo_func(a=1, b=2, c=3)

8、为参数设置默认值

1)定义函数时可以指定形式参数的默认值
2)指定默认值的形式参数必须放在所有参数的最后,否则会产生语法错误
3)param=default_value:可选,指定参数并且为该参数设置默认值为 default_value
def function_name(name, nationality="中国"):
    print(f"姓名为{name}")
    print(f"国籍为{nationality}")

9、函数返回值

  • return value:可选,指定要返回的值为value
# 定义加法函数
def sum(a, b):
    result = a+b
    # 函数返回值,将a+b等结果返回,可返回多个值
    return result, a, b

10、可变参数

1)可变参数也称为不定长参数
2)传入函数中实际参数可以是任意多个
3)常见形式
  • *args

    ①接收任意多个实际参数,并将其放到一个元组中
    ②使用已经存在的列表或元组作为函数的可变参数,可以在列表的名称前加*
    
  • **kwargs

    ①接收任意多个类似关键字参数一样显式赋值的实际参数,并将其放到一个字典中
    ②使用已经存在字典作为函数的可变参数,可以在字典的名称前加**
    
"""1、可变参数 *args"""
# *args 接收任意多个实际参数,并将其放到一个元组中
# 参数定义时,*收集了所有的位置参数,放在一个元组当中,args就是元组,其实就是打包的过程
def print_language(*args):
    print(args)
    # 将元组中的元素打印出来
    for i in args:
        print(i)

# 调用函数,把不同数量的参数传递进去,用位置参数,传递进去的参数都会放在元组当中
print_language('python', 'java')
print_language('python', 'java', 'go', 'php')

# 传已存在的列表或元组作为函数的可变参数
lan = ['python', 'java', 'go']
print_language(lan)    # 直接传列表,整个列表作为一个元素作为参数传递
# 函数调用过程,*相当于解包为不同的参数,等价于 print_language('python', 'java')
print_language(*lan)   # 加入*,相当于解包,将列表的单个元素作为参数传递


"""2、可变参数 **kwarg"""
# **kwargs 接收任意多个类似关键字参数一样显式赋值的实际参数,并将其放到一个字典中
def print_info(**kwargs):
    print(kwargs)
    for i, j in kwargs.items():
        print(i, j)
        
# 写法一:调用函数,要用关键字参数传参
print_info(tom=20, lily=18, anna=19)
# 写法二
d = {'tom': 20, 'lily': 18, 'anna': 19}
print_info(**d)

11、python lambda 表达式

1)匿名函数:没有名字的函数,用 lambda 表达式创建匿名函数
2)使用场景:
* 需要一个函数,但是又不想费神去命名这个函数
* 通常在这个函数只使用一次的场景下
* 可以指定短小的回调函数
3)语法
result:调用 lambda 表达式
[arg1 [, arg2, …. , argn]]:可选,指定要传递的参数列表
expression:必选,指定一个实现具体功能的表达式
    result = lambda [arg1 [, arg2, .... , argn]]: expression
import math
# 例子1、定义一个计算圆面积的函数
# 使用lambda表达式实现
r1 = 10
# 要有变量调用lambda表达式
result1 = lambda r1:math.pi*r1*r1
print(f"半径为{r1}的圆的面积为{result1(r1)}")
# 没有变量调用lambda表达式,会直接打印函数存放的内存地址,无法直接获取表达式的结果
print(lambda r1: math.pi*r1*r1)

# 可以指定短小的回调函数
# 例子2、对获取到的信息进行排序
# 例:书籍信息
book_info = [
    ('python', 22.5),
    ('java', 20),
    ('go', 25)
]
print(book_info)
# 指定规则进行排序
# lambda x: (x[1]),x为列表中的每个元组,x[1]返回每个元组中的第二个元素
book_info.sort(key=lambda x: (x[1]))
print(book_info)