从C到Py:Python中的函数
在本篇文章中,我们将讲解Python中有关函数的部分,如果掌握C语言的基础,那不难发现Python中函数的知识实际也十分相似。
定义
python中定义函数的语法格式:
def 函数名(参数列表):
函数体
return 返回值列表
函数名自己定义,不能与保留字等冲突,不能用空格链接,最好替换成下划线。函数体部分实现函数的功能,最后返回值。与C语言相比,python的函数定义过程较为简洁,要求也更宽松。
以下是一个简单的求和函数的实例:
def get_sum(num):s=0for i in range(1, num+1):s+=iprint(f'1加到{num}的和为:{s}')
传参
1、位置传参
调用时参数个数和顺序必须定义相同。
2、关键字传参
调用时使用“形参名称=值” 顺序可以与定义时不同。
def happy_birthday(name, age):print('祝'+name+'生日快乐')print(str(age)+'岁生日快乐')happy_birthday(age=18, name='abc')
# 这里使用关键字传参替换了age和name的位置
PS:一个函数调用可以同时使用以上两种传参
3、默认值传参
在定义时直接对形参赋值,调用时如果不传参,将使用默认值
PS:如果同时使用位置参数,默认值参数,需要将默认值参数置于最后。
4、可变参数
①:个数可变的位置参数
在参数前加一颗星 *para ,调用时可接收任意个数的实际参数,并放到一个元组中。
以下为示例:
def fun(*para):print(type(para))for item in para:print(item)fun(10, 20, 30, 40)
fun(10)
fun([11, 22, 33, 44, 55])
# 以下为输出结果
# <class 'tuple'>
# 10
# 20
# 30
# 40
# <class 'tuple'>
# 10
# <class 'tuple'>
# [11, 22, 33, 44, 55]
②:个数可变的关键字参数
在参数前加两颗星 **para ,调用时可接收任意多个“参数=值”形式的参数,并放到一个字典中。
PS:若要传递字典d,参数写 **d 进行系列解包操作
返回值
这一部分依旧不难理解,就是函数在调用时返回的数值。值得注意的是,python中函数返回值如果是多个,返回结果为元组类型。下面看一个求和函数,他将分别返回奇数和、偶数和以及总和:
def get_sum(num):s=0odd_sum=0even_sum=0for i in range(1, num+1):if i % 2 !=0:odd_sum+=ielse:even_sum+=is+=ireturn odd_sum, even_sum, sprint(get_sum(10))
a, b, c=get_sum(10)
print(a)
print(b)
print(c)
# 以下为输出结果
# (25, 30, 55)
# 25
# 30
# 55
作用域
在函数内部定义的变量称为局部变量,定义在函数外(准确来说是所有程序之前)的变量称为全局变量。不同的变量有不同的作用域,或者说生命周期,简言之我们只需记住在函数内部定义的变量,只能在函数内部操作。
匿名函数lambda
这是Python独有的一种函数,没有名字,只能使用一次,一般在函数体只有一句代码且只有一个返回值时,可用匿名函数来简化。
语法格式:result=lamada 参数列表:表达式 (result直接得到表达式的返回值)
例如,以下两种函数的写法是相当的:
def calc(a, b):return a+bprint(calc(1,2))s=lambda a, b: a+b
print(type(s))print(s(10, 20))
# 输出结果
# 3
# <class 'function'>
# 30
内置函数
下面介绍一些Python自带的内置函数。
1、类型转换函数
函数名称 | 描述说明 |
bool(obj) | 获取指定对象obj的布尔值 |
str(obj) | 将指定对象obj转成字符串类型 |
int(x) | 将x转成int类型 |
float(x) | 将x转成float类型 |
list(sequence) | 将序列转成列表类型 |
tuple(sequence) | 将序列转成元组类型 |
set(sequence) | 将序列转成集合类型 |
2、数学函数
函数名称 | 描述说明 |
abs(x) | 获取x的绝对值 |
divmod(x,y) | 获取x与y的商和余数 |
max(sequence) | 获取sequence的最大值 |
min(sequence) | 获取sequence的最小值 |
sum(iter) | 对可迭代对象进行求和运算 |
pow(x,y) | 获取x的y次幂 |
round(x,d) | 对x进行保留d位小数,结果四舍五入 |
3、迭代器操作函数
常见的可迭代对象有:字符串、列表、元组
函数名称 | 操作说明 |
sorted(iter) | 对可迭代对象进行排序 |
reversed(sequence) | 反转序列生成新的迭代器对象 |
zip(iter1,iter2) | 将iter1与iter2打包成元组并返回一个可迭代的zip对象 |
enumerate(iter) | 根据iter对象创建一个enumerate对象 |
all(iter) | 判断可迭代对象iter中所有元素的布尔值是否都为True |
any(iter) | 判断可迭代对象iter中所有元素的布尔值是否都为False |
next(iter) | 获取迭代器的下一个元素 |
filter(function,iter) | 通过指定条件过滤序列并返回一个迭代器对象(这里的function是一个函数) |
map(function,iter) | 通过函数function对可迭代对象iter的操作返回一个迭代器对象 |
PS:迭代器对象的类型是 class 'List_reverseiterator
针对最后两个函数进行举例:
# 此函数对奇数返回True
def fun(num):return num % 2==1obj=filter(fun, range(10))
# filter将对1~9调用fun函数进行判断,为真则添加到迭代器对象中
print(list(obj))# 输出结果:[1, 3, 5, 7, 9]
下面这个函数实现转换大小写:
def upper(x):return x.upper()lst=['hello', 'world', 'Python']
obj2=map(upper, lst)
print(list(obj2))# 输出结果:['HELLO', 'WORLD', 'PYTHON']
4、其他函数
函数名称 | 描述说明 |
format(value,format_spec) | 将value以format_spec格式显示 |
len(s) | 获取s的长度或s元素的个数 |
id(obj) | 获取对象的内存地址 |
type(x) | 获取x的数据类型 |
eval(s) | 执行s这个字符串所表示的Python代码 |
这里再详述一下第一种函数:
print(format(3.14, '20')) # 数值默认右对齐
print(format('hello', '20')) # 字符串默认左对齐
print(format('hello', '*>20')) # *是填充符,<是左对齐,>是右对齐,20是显示宽度
print(format(3.1415926, '.2f'))
# 输出结果
# 3.14
# hello
# ***************hello
# 3.14