Python函数

1 函数定义

1.1 函数概述

  • 在程序中有些功能的代码是一样的,只不过处理的数据不一样,这种情况可以将这些代码组合在一起放到函数中,要使用此功能只需调用该函数就可以了,不仅提高了代码的复用性,也极大的提升了代码的可维护性。

1.2 函数的定义

  • 在Python中函数由关键字def、函数名、参数以及一系列语句组成的。定义函数的语句如下:
>>> def show_user():
>>>     print("hello!")
>>>
>>> show_user()

代码第1行使用关键字def来告诉Python要定义一个函数,关键字后面是函数名称,函数名称后面是一对括号,如有参数就放在括号中,即使没有参数括号也不能省略,最后以昌号结尾。
代码第2行是函数体内唯一的一行代码。

1.3 向函数传递参数

我们将上述定义的函数做个修改,让其支持能传递一个参数,示例如下:

>>> def show_user(username):
>>>     print(f"hello:{username}!")
>>>
>>> show_user('leo')
"hello:leo!"
>>> show_user('jack')
"hello:jack!"

函数show_user支持传递一个参数,并将其打印出来。

1.4 形参和实参

  • 形参:称为形式参数,不是实际存在的变量,函数定义中用的参数就是形参,目的是用于在调用该函数时接收接入传入的参数。
  • 实参:称为实际参数,是实际存在的变量,是在调用函数时传递给函数的参数。
  • 形参和实参的功能就是数据数据传送的功能。

2 函数的参数

2.1 参数类型

  • 可变类型:若传递给函数的参数是一个可变数据类型,如列表或字典,相当于传给函数的是一个引用,那么在函数内部对参数的修改也会影响到外部的变量,示例如下:
>>> def add_list_val(my_list):
>>>     # 新增1个值到列表中
>>>     my_list.append(10)
>>>     print("函数内部变量值:", my_list)
>>> 
>>> my_list = [100, 200, 300]
>>> add_list_val(my_list) # 传递实参为可变数据类型列表
>>> print("函数外部变量值:", my_list)

===============程序运行结果===============
函数内部变量值:[100, 200, 300, 10]
函数外部变量值:[100, 200, 300, 10]

可以看出函数内部对参数的修改也影响了外部变量,若不想影响外部变量,为解决这个问题可以传递列表的副本而非原件,这样函数内部所做的任何修改都只影响副本,原件不受影响,传递列表副本的方式为:add_list_val(my_list[:]),[:]为切片方法表示创建列表的副本。

  • 不可变类型:若传递给函数的参数是不可变数据类型,如元组、字符串、整数等,那么在函数内部对参数的修改不会影响到外部的变量,示例如下:
>>> def chg_val(val):
>>>     # 修改参数的值
>>>     val = 100
>>>
>>> val = 1
>>> chg_val(val)
>>> print(val)

===============程序运行结果===============
1

从运行结果可以看出函数内部对参数的修改不会影响了外部变量。

2.2 位置参数

  • 在调用函数时,传递的每个实参都要与函数定义中相应的形参关联,最简单的关联方式就是基于实参的顺序,这种关联方式称为位置实参。
  • 位置实参的顺序很重要,在使用位置实参调用函数时,如果实参位置不对,那结果可能会出乎意料。

2.3 默认参数

  • 可以给函数的形参指定默认值,在调用函数时如果给形参提供了实参时,那么将使用指定的实参值,如果未给形参提供值就用形参的默认值,默认参数使用示例如下:
>>> def show_student(name, age='20'):
>>>     # 显示学生姓名和年龄
>>>     print(name + ':', age)
>>> # 以下两种函数调用方式都可以
>>> show_student("张三")
>>> show_student("张三", 19)

===============程序运行结果===============
张三:20
张三:19

2.4 关键字参数

  • 调用函数传递实参时使用“名称=值”的方式,称为关键字参数,这种传递实参方式让你无需考虑参数的顺序,而且能清楚标明函数调用中各个值的功能,示例如下:
>>> def show_student(name, age):
>>>     # 显示学生姓名和年龄
>>>     print(name + ':', age)
>>> # 使用关键字参数方式调用函数
>>> show_student(age=24, name="张三")

===============程序运行结果===============
张三:24

2.5 不定长参数

  • Python函数支持传递任意数量的实参,只需在形参名称前面添加一个“*”号即可,这种参数就称为不定长参数,无论实参传多少个进来都一并收集,示例如下:
>>> def show_menu(*menus):
>>>     """显示顾客点的所有菜,显示前我们并不知道顾客点了几道菜"""
>>>     print(menus)
>>>
>>> show_menu('番茄炒蛋')
>>> show_menu('小炒肉片','榨菜肉丝汤','干锅包菜')

===============程序运行结果===============
('小炒肉片',)
('小炒肉片', '榨菜肉丝汤', '干锅包菜')

形参名*menus中的星号表示让Python创建一个名为menus的空元组,接收到的所有实参值都放到这个元组中,因此函数体中的menus是一个元组,打印结果显示的也是元组。
*参数名:表示不定长参数,实现方式为创建空元组
**参数名:表示不定长的关键字参数,实现方式为创建空字典

2.6 参数组合

  • Python函数的参数有:必选参数、默认参数、可变参数等,我们可以组合使用这些参数,组合使用时顺序必须是:必选参数、默认参数、可变参数。比如要定义一个函数,包含上述几种参数,示例如下:
>>> def func(aa, bb, cc=0, *args, **key_val):
>>>     print('aa=', aa, 'bb=', bb, 'cc=', cc, 'args=', args, 'key_val=', key_val)

print(func(1, 2))  
# 输出结果:aa= 1 bb= 2 cc= 0 args= () key_val= {}
print(func(1, 2, c=3))  
# 输出结果:aa= 1 bb= 2 cc= 3 args= () key_val= {}
print(func(1, 2, 3, 'a', 'b'))  
# 输出结果:aa= 1 bb= 2 cc= 3 args= ('a', 'b') key_val= {}
print(func(1, 2, 3, 'a', 'b', x=4))  
# 输出结果:aa= 1 bb= 2 cc= 3 args= ('a', 'b') key_val= {'x': 4}
args = (1, 2, 3, 4)
key_val= {'x': 5}
print(func(*args, **key_val))  
# 输出结果:aa= 1 bb= 2 cc= 3 args= (4,) key_val= {'x': 5}

3 函数返回值

  • 函数可以返回一个或一组值,在函数中可使用 return 语句将值返回给程序调用体,返回值让我们能将大部分繁重的工作移到函数中去完成,从而简化主程序。
  • 若函数中没有 return 语句,则返回值为 None。
def add(a, b):
    print('两数相加结果为:', a + b)
    return x + y

4 函数分类

4.1 内置函数

  • Python自带的函数就叫内置函数,无需导入任何函数库即可直接调用,为开发者提供了极大的便利。常用的内置函数有:
type()id()int()hex()bin()
oct()input()print()str()float()
list()tuple()dict()bytes()abs()
all()any()ascii()bin()bool()
breakpoint()bytearray()callable()chr()classmethod()
compile()complex()delattr()dir()divmod()
eval()exec()filter()format()frozenset()
getattr()hasattr()hash()help()isinstance()
issubclass()iter()len()locals()map()
max()min()memoryview()next()object()
oct()open()ord()pow()property()
range()repr()reversed()round()set()
setattr()slice()sorted()staticmethod()sum()
super()vars()zip()_import_()

4.2 自定义函数

  • 内建函数不可能满足所有的需求,开发者可以根据需要自已定义函数,函数自定义后,就可以在其他地方通过函数名称调用。

5 将函数存储在模块中

  • 使用函数的优点是可将代码与主程序分离,将函数命名为具有意义的描述性名称,有助于让主程序更容易理解。我们还可以将函数存储在模块(文件)中,再将模块导入到主程序中使用。
  • 函数存储在独立的文件中,可隐藏代码的细节,将重点放在高层逻辑上,也能让更多不同的程序重复使用。
  • 下面介绍几种导入模块的方法

5.1 导入整个模块

  • import module_name,模块就是扩展名为 .py 的文件,假设有一个模块为 game.py,导入整个模块语句:import game

5.2 导入特定函数

  • from module_name import function_name
  • from module_name import function_name_1, function_name_2

5.3 使用as给函数指定别名

  • from module_name import function_name as fn

5.4 使用as给模块指定别名

  • import module_name as m

5.5 导入模块中所有函数

  • from module_name import *

6 函数式编程

  • 函数式编程的特点是允许将函数作为参数传递给另一个函数,允许返回结果是一个函数。

6.1 高阶函数

  • 将函数作为实参传递或返回结果是一个函数的函数称为高阶函数。

6.2 匿名函数

  • 匿名函数就是不使用def这样标准形式定义的函数。
  • Python经常用 lambda 来创建匿名函数,lambda 只是一个表达式,函数体比较简洁。语法格式为:lambda [arg1[,arg2],…argn]]:expression,示例如下:
sum = lambda a, b: a + b
print(sum(5, 5))

===============程序运行结果===============
10

上述代码第1行定义了一个 lambda 函数,接收两个参数并求和,同时将函数命名为sum。第2行代码通过sum()函数即实现了调用 lambda 函数的功能。

  • 25
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值