Python 函数

认识函数

在一个完整的项目中,某些功能会反复使用。那么会将这部分功能封装成函数,使用这些功能时直接调用即可。函数的本质:对功能的封装。

函数分类

函数分为两类:

1.系统内建函数,如print()、len()等。

2.用户自定义函数

函数优点

1.简化代码结构,增加了代码的复用性(重复使用的程度)

2.如果想修改某些功能获取调试某个BUG,只需要修改对应的函数即可。

定义函数

格式

def:函数代码块以def关键字开始,

函数名:需遵循标识符规则。

参数列表(参数1,参数2,参数3,......,参数n):任何传入函数的参数和变量必须放在小括号之中,用英文逗号分隔。函数从函数调用者处获取信息。

冒号:函数内容(封装的功能)以冒号开始,并且缩进。

语句:函数封装实现具体业务的功能。

return:一般用于结束函数,并返回信息给函数调用者。

表达式:是要返回给函数的调用者信息;如果不写return,则没有返回即return None。

示例如下:

def 函数名(参数列表):
    语句
    return 表达式

创建函数

创建一个最简单的函数,没有参数没有返回的函数。

示例如下:

def test():
    print('hello world')

函数的调用

格式:函数名(参数列表)

函数名:要调用的功能封装后的函数名称

参数列表:函数的调用者给函数传递的信息

函数调用的本质:实参给形参赋值的过程。

示例如下:

def test():
    print('hello world')

# 调用最简单的函数
test()
test()

# 运算结果
# hello world
# hello world

函数参数

形参(形式参数):定义函数时小括号中的变量,本质是变量

参数必须按照顺序传递,个数也要对应。

实参(实际的参数):调佣函数时给函数传递的信息,本质是值。

函数传参示例

编写一个函数,输入名称和年龄,在函数内容打印出来。

示例如下:

def get_student(name, age):
    print(name, age)

get_student('小明', 18)
# 运算结果
# 小明 18

不按照顺序

把名称和年龄交换位置进行传递。

示例如下:

def get_student(name, age):
    print(name, age)

# get_student('小明', 18)
get_student(18, '小明')
# 运算结果
# 18 小明

结果并没有报错;但如果业务在复杂点,比如把变量整理成一段话;

因为变量的值不同,处理也不同,交换了变量的值就会产生错误。

示例如下:

def get_student(name, age):
    # print(name, age)
    print(name + '的岁数是' + str(age))

# get_student('小明', 18)
get_student(18, '小明')

结果如下:

Traceback (most recent call last):
  File "E:\lianxipy\day3\函数1.py", line 27, in <module>
    get_student(18, '小明')
  File "E:\lianxipy\day3\函数1.py", line 24, in get_student
    print(name + '的岁数是' + str(age))
TypeError: unsupported operand type(s) for +: 'int' and 'str'

个数不对应

个数不对应就是只传一个名称或者年龄。

示例如下:

def get_student(name, age):
    # print(name, age)
    print(name + '的岁数是' + str(age))

# get_student('小明', 18)
# get_student(18, '小明')
get_student('小明')

结果如下:

Traceback (most recent call last):
  File "E:\lianxipy\day3\函数1.py", line 28, in <module>
    get_student('小明')
TypeError: get_student() missing 1 required positional argument: 'age'

函数返回值

编写一个函数,传递两个数值类型的参数,返回这两个数的和。

示例如下:

def get_sum(num1, num2):
    """ 计算两数之和 """

    # 返回表达式
    return num1 + num2

num_sum = get_sum(20, 34)
print(num_sum)
num_sum = get_sum(18, 34)
print(num_sum)

# 运算结果
# 54
# 52

在函数内部,执行完return语句,该函数就执行完成了,其后代码将不再执行。

传递参数

值传递

传递的不可变类型;String、tuple、number是不可变的

示例如下:

def fun1(num):
    num = 20

num = 10
fun1(num)
print(num)

# 运算结果
# 10

实例中有int对象10,指向它的全局变量是num,在传递给 fun1 函数时,按传值的方式复制了全局变量 num,都指向了同一个Int对象,在num=20时,则新生成一个int值对象20,并让局部变量num指向它;但未改变全局变量num,故最后打印值没有改变。

引用传递

传递的可变类型;List、dict、set是可变的

示例如下:

def fun2(list1):
    list1[0] += 10

list1 = [1, 2, 3, 4, 5]
fun2(list1)
print(list1)

# 运算结果
# [11, 2, 3, 4, 5]

实例中传入函数的和在方法内修改内容的对象用的是同一个引用,所以结果改变了。

关键字参数

关键字参数:允许函数调用时参数的顺序与定义不一致

示例如下:

def get_student(name, age):
    print(name + '的岁数是' + str(age))

# 使用关键字参数
get_student(age=18, name='小明')

# 运算结果
# 小明的岁数是18

默认参数

默认参数:调用函数时,如果没有传递参数,则使用默认参数。

给方法设置了默认名称和默认年龄:

示例如下:

def get_student(name='小明', age=18):
    print(name + '的岁数是' + str(age))

get_student()
get_student('小红')
get_student('小刚', 19)

# 运算结果
# 小明的岁数是18
# 小红的岁数是18
# 小刚的岁数是19

当不传递参数时,使用默认参数;如果有参数,则使用传递的参数。

注意:默认参数需要放到最后,否则会报错。

当设置名称为默认参数,年龄为必填参数时。

示例如下:

def get_student(name='小明', age):
    print(name + '的岁数是' + str(age))


get_student(18)

直接调用会抛出错误:

E:\lianxipy\venv\Scripts\python.exe E:\lianxipy\day3\函数1.py

  File "E:\lianxipy\day3\函数1.py", line 69

    def get_student(name='小明', age):

                   ^

SyntaxError: non-default argument follows default argument

正确设置为最后一个设置默认。

示例如下:

def get_student(name, age=18):
    print(name + '的岁数是' + str(age))

get_student('张三')

# 运算结果
# 张三的岁数是18

不定长参数

概念:能处理比定义时更多的参数。

一个星号

示例如下:

def fun3(name, *arr):
    print(name)
    for x in arr:
        print(x)

fun3('张三', '李四', '王五', '赵六')

# 运算结果
# 张三
# 李四
# 王五
# 赵六

加了星号(*)的变量存放所有未命名的变量值。

也就是:李四、王五、赵六

*arr格式为元组;如果在函数调用时没有指定参数,则*arr为一个空元组。

示例如下:

def fun3(name, *arr):
    print(name)
    print(arr)
    for x in arr:
        print(x)

fun3('张三', '李四', '王五', '赵六')
print('--'*10)
fun3('张三')

# 运算结果
# 张三
# ('李四', '王五', '赵六')
# 李四
# 王五
# 赵六
# --------------------
# 张三
# ()

两个星号

不定长参数的另一种实现方式,存储字典形式的参数值。

示例如下:

def fun4(**kwargs):
    print(kwargs)
    print(type(kwargs))

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

# 运算结果
# {'a': 1, 'b': 2, 'c': 3}
# <class 'dict'>

**代表键值对的参数字典,和*所代表的意义类似。

示例如下:

def fun4(*arr, **kwargs):
    # 数字 字符串类型的会被arr接收
    print(arr)
    print(type(arr))
    # 字典类型的参数会被kwargs接收
    print(kwargs)
    print(type(kwargs))

fun4(1, 2, 'a', 'b', a=1, b=2, c=3)

# 运算结果
# (1, 2, 'a', 'b')
# <class 'tuple'>
# {'a': 1, 'b': 2, 'c': 3}
# <class 'dict'>

匿名函数lambda

概念

不适用def这样的语句定义函数,使用lambda来创建匿名函数

特点

1.Lambda只是一个表达式,函数体比def简单

2.Lambda的主体是一个表达式,而不是代码块,

仅仅只能在lambda表达式中封装简单的逻辑

3.Lambda函数有自己的命名空间,

且不能访问自由参数列表之外的或全局命名空间的参数

4.lambda是一个表达式且只能写一行,与C和C++内联函数不同

示例如下:

sum = lambda num1, num2:num1+num2
print(sum(2, 3))

# 运算结果
# 5

总结

通过学习python函数教学视频整理的笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JSON_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值