Python 函数小结
在编程语言中,函数是什么?
函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段。而在python中,函数式python实现功能的基本单位。在开发中,函数有利于开发者的调试,修改,和阅读理解,而函数之间的互相调用,也使得代码提高了灵活性,还简化了程序的代码量。
内置函数
内置函数,编程语言中的预先定义的函数,用来提高程序的执行效率,而内置函数也大大的提高了程序员的效率和程序的阅读。
Python中定义了许多内置函数,比如常见的输出函数print(),输入函数input(),在编写代码的过程中,可直接调用内置函数即可实现对应的功能。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1mbukTuz-1628327228051)(C:\Users\LENOVO\Pictures\QQ图片20210807112017.png)]
Python官方文档网址:https://docs.python.org/zh-cn/3/library/functions.html
自定义函数
除了上述的内置函数之外,我们在日常编程中还可以根据实际情况自定义函数,以满足各种复杂的开发需求。
如何定义一个函数:
Python的函数定义方法是使用关键字 “def” ,函数定义的语法格式如下:
def 函数名(参数列表):
"""函数的功能说明"""
函数体
语法规则
- 1,函数必须使用关键字 “def” 定义,后面依次是函数名称,“()”和 “:”
- 2,函数名称必须以字母和下划线 “_” 开头,不能使用Python关键字作为函数名称。
- 函数的代码块必须在 “def” 的位置上执行缩进处理,代表这部分属于这个定义的函数
- 如果函数的代码块设有关键字return,就说明函数有返回值;如果没有return关键字,就代表函数返回None。
def hello() :
print("Hello World!")
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cAOLujH6-1628327228071)(C:\Users\LENOVO\Pictures\QQ图片20210807114015.png)]
# 计算面积函数
def area(width, height):
return width * height
w = 4
h = 5
print(f'width ={w}, height ={h}, area={area(w, h)})
函数的参数
函数的参数是将函数外部的数据传入函数内部,在不同的情境下,参数可分为形参和实参,形参是在函数定义过程中的状态,实参是参数在函数调用过程中的状态。当我们在定义函数的过程中,可以根据实际情况设置参数的类型和数量。
形参
形参即形式上的参数,可以想象为函数 f(x) 中的x,没有实际的值。在实际运用中,在函数定义中设置的函数参数即为形参,形参只参与函数定义过程,这个过程没有赋予实际的数值。
实参
实参即为实际意义上的参数,一个实际存在的参数,在函数调用过程中,需要对参数设置具体的数值,当参数被赋予之际的数值后,它会由形参变为实参。
参数的类型
- 必须参数(位置参数)
- 默认参数
- 关键字参数
- 可变参数
必须参数
必须参数是在函数调用过程中必须设置的函数,并且参数的设置顺序不能改变。
def print_str(str):
"""打印字符串"""
return str
print(printme())
#报错,当参数不对应时
"""
Traceback (most recent call last):
File "<ipython-input-6-19c689ae8a3e>", line 1, in <module>
printme()
TypeError: printme() missing 1 required positional argument: 'str'
"""
def calculation(x, y):
return x*2 + y*3
print(calculation(3,2,4))
#当参数多了
"""
Traceback (most recent call last):
File "C:\Users\LENOVO\untitled0.py", line 28, in <module>
print(calculation(3,2,4))
TypeError: calculation() takes 2 positional arguments but 3 were given
"""
默认参数
调用函数时,如果没有传递参数,则会使用默认参数。而在实际使用中,可以对变动较少的参数设置默认值,在函数调用过程中就无须设置已有默认值的参数,该参数会使用默认值参与函数执行过程。
def stu( name, age = 15 ):
return name, age
print(stu('张三'))
"""
输出:('张三', 15)
"""
#注意的是,如果一个函数内有必须函数和默认函数,默认函数必须排在必须函数的后面。
print(stu(age=16,'张三'))
#报错:SyntaxError: positional argument follows keyword argument
#但我们将函数名与要传入的值一起使用的时候,可不比在意参数顺序
print(stu(age=18, name = '李四'))
关键字参数
上述两个参数在使用过程中必须按原有的参数顺序进行设置,在使用过程中,我们可能设置多个参数,在调用参数的时候只设置部分函数,这样必须参数,默认参数就无法灵活使用。为了提高参数的灵活性,我们在函数调动过程中可以明确设置参数名字并赋值,而实现这一过程的是关键字参数。
def student(name, age, **interest):
return name, age, interest
print(student('大王', 16, sex='男', num='10014'))
"""
注意:
1,关键字参数在函数调用过程中设置参数名称和参数值。(参数名=参数值)
2,如果全部是上述的形式,可不必在意参数循序。否则,参数必须按照原有的排序方式。
"""
可变参数
一个函数设有多个参数,在定义和调用过程中,代码量会大大增加,不利于后期的维护和阅读,可变参数就是为了解决上述问题。可变参数在定义的时候无须明确设置参数名称,在调用过程中可根据实际需要进行设置,具有较大的灵活性。
def number( arg1, *vartuple ):
return arg1,vartuple
print(number( 70, 60, 50 ))
#输出:(70,(60,,50))
print(number(10,[30, 40, 20]))
#输出:(10, ([30, 40, 20],))
"""
注意:
1,参数列表的每个元素都没有明确的参数名称,只有具体的参数值
2,加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数
"""
声明函数时,参数中星号 ***** 可以单独出现如果单独出现星号 ***** 后的参数必须用关键字传入。
函数返回值
函数返回值有关键字return好yield实现,return是在返回结果的同时中断函数的执行,yield返回结果并不中断函数的执行。而Python3允许开发者定义函数返回值的数据类型,显示函数返回值的数据格式可以确保程序在执行过程中减少数据异常。函数返回值的数据类型在函数命名过程中的设置:fun()->str。即为将函数fun()的返回值设为字符串格式。
def fun1()->list:
return 'Python'
函数的调用
函数的调用方式为:函数名()。程序首先找到花括号,认定当前语句代表函数调用,然后根据函数名查找相对应的函数并执行。
def fun1():
print('这是fun1')
def fun2(name):
print(f'这是fun2,名字是{name}')
fun1()
def fun3(name):
print(f'这是fun3,名字是{name}')
fun2('张三')
fun3('李四')
"""运行结果:
这是fun3,名字是李四这是fun2,名字是张三这是fun1先调用并执行fun3,在fun3里,调用并执行fun2,而在fun2调用并执行fun1
"""
注意:避免函数之间相互调用陷入死循环。
变量的作用域
Python中的作用域一共有4种。
- L(local)局部作用域
- E(Enclosing)闭包函数外的函数中
- G(Global)全局作用域
- B(Built_in)内建作用域
在python中,程序以L—》E—》G—》B的规则查找。即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。
匿名函数
匿名函数是不使用def语句定义一个函数,它是使用lambda语句创建的一个函数。
#一般形式
def func(x, y):
return x*2+y*3
#匿名函数
f = lambda x, y:x*2+y*3
"""
使用规则:
1,函数只有一个表达式,而且必须设有返回值。
2,可以没有参数,也可以有一个或多个参数,并且不限制参数类型。
3,lambda语句后面设置参数名称,如果没有则无须写,有的话,表达式在参数后面,并有‘:’将表达式和参数隔开。
"""
f = lambda x,y=20,**kwargs:x*2+y*3+kwargs['z']*4print(f(10, z=30))
实例
排序算法
#冒泡算法
def sortdata(data):
"""冒泡排序"""
for j in range(len(data)+1):
for j in range(len(data)-j-1):
if data[i] > data[i+1]:
data[i], data[i+1] = data[i+1], data[i]
return data