为什么需要函数:
有时候,一些代码可能要在许多地方使用。如果采用传统的方式,一直重复编写相同的代码,那么代码将变得非常糟糕,并且非常难以维护。这时候我们就可以采用函数,来把一些重复执行的代码封装成一个函数,以后要再调用相同的代码的时候,就只要调用这个函数就可以了。
函数定义和调用:
定义函数:语法是使用def:
def 函数名(参数,可以为空):
代码块
```
### 示例:
```
def greet():
print('hello world')
调用函数:语法是使用这个函数的名字,后面再给个圆括号: 函数名(参数,可以为空) # 示例: ``` greet()
函数参数:函数可以传递参数进去给函数:
def add(a,b): print(a+b)
形参:就是在定义函数的时候指定的参数。
实参:就是在调用函数的时候传递进去的参数。
位置参数:位置参数就是按照形参中给定的参数的顺序。
def add(a,b): print(a+b) # 调用add add(1,2)
在上例中,调用add函数,给的值a为1,b为2。这种位置很重要的参数叫做位置参数。
关键字参数:在传递参数的时候,可以按照形参的名字给定参数。
def add(a,b): print(a + b) # 调用add add(a=1,b=2) # 调换a和b参数的顺序来调用add函数 add(b=1,a=2) args和*kwargs:分别代表的是缺省的位置参数和关键字参数。
def add(args,*kwargs): print(args) print(kwargs) # 调用add add(1,2,a=3,b=4) 其中1和2是位置参数,会保存在args中,a=3,b=4是位置参数,保存在kwargs中。 传递到函数中的args是一个元组,kwargs是一个字典。
元组和字典拆分出来成位置参数和关键字参数:
a = ('a','b','c') b = {"username":"hlcoding","age":18} def greet(args,*kwargs): print(args) print(kwargs)
greet(*a,**b) # 将a这个元组个的元素一个个拆开来给`args`,将`b`拆开来一个个给`kwargs`
默认参数:有时候一些参数,你可能需要给函数调用者,使用一个默认的参数,那么可以通过以下方式实现:
def greet(name,age=18): print(name,age) greet('hlcoding') #age将使用18来作为默认参数 greet('hlcoding',age=20) #age将使用20来作为默认参数
默认参数一定要放在其他参数的后面,但是放在缺省参数的前面。
函数返回值:函数可以有返回值:
def add(a,b): return a + b
可以使用元组来返回多个值:
def greet(): return 'hlcoding',18
## 函数中变量的作用域:
局部变量:函数中的变量,不能在外面使用。
def greet(): name = 'hlcoding' print('my name is %s'%name)
print(name) # 报错,因为name只在greet函数中有用
全局变量:全局变量是在函数或者某个代码块外面定义的变量,可以在函数中进行使用。
username = 'hlcoding' def greet(): print('my name is %s' % username) greet() ```
global关键字:如果想在函数或者某个代码块中修改全局变量,那么应该使用global关键字。
username = 'hlcoding'
def greet():
username = 'ketang' # 此时不是修改全局变量username,而是定义一个与全局变量相同名字的变量
print('my name is %s' % username)
greet()
print(usernmae) # 这时候username仍然是`hlcoding`。
列表和字典当作全局变量:列表和字典当作全局变量,在函数或者代码块中使用的时候,可以任意的增删改查列表和字典的值。但是如果要修改这个全局变量指向的值,则必须加global关键字。
persons = ['zhangsan','lisi']
def add_person(name):
persons.append(name)
add_person('wangwu')
print(persons) # 这时候persons已经变成['zhangsan','lisi','wangwu']了。
```
而如果你直接修改persons的指向,但没有使用global关键字,那么做的操作,将是在本地申请一个局部变量:
persons = ['zhangsan','lisi']
def add_person():
persons = ['wangwu']
add_person()
print(persons) # 仍然是'zhangsan'和lisi
## 匿名函数:
列表排序sort:使用sort给列表中的值进行排序的时候。如果列表中装的是字典,那么将不能正确的排序:
l = [{'username':'zhangsan','age':18},{"username":'lisi','age':20}] l.sort() ``` 正确的写法应该是:
l = [{'username':'zhangsan','age':18},{"username":'lisi','age':20}]
def sort_key(x):
return x['age'] # 根据年龄进行排序
l.sort(key=sort_key)
以上是定义一个函数来作为key,但是这个key的函数只需要用一次,以后再也用不到了,因此一般这种情况,我们可以使用匿名函数,也即lambda表达式,可以更好的完成我们的需求:
l = [{'username':'zhangsan','age':18},{"username":'lisi','age':20}]
l.sort(key=lambda x:x['age'])
自己动手写一个需要函数作为参数的函数:我们可以模范python自带的sort函数来实现一个做计算器运算的函数,我们让用户输入值,和计算方式:
def calculate(x,y,func):
return func(x,y)
# 实现一个加法计算器
calculate(1,2,lambda x,y:x+y)
# 实现一个减法计算器
calculate(2,1,lambda x,y:x-y)
# 实现一个乘法计算器
calculate(1,2,lambda x,y:x*y)
# 实现一个除法计算器
calculate(4,2,lambda x,y:x/y)
—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com