函数
1. 如何定义函数
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明
- 函数内容以冒号起始,并且缩进
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None
- 函数的声明一定要在调用之前
2. 函数的定义
- 函数就是我们将一些功能封装起来,减少一部分类似的代码
例子(如果有一百个类似的需求,那么函数就显得很方便了)
1. 求1-10的和
sum1 = 0
for i in range(11):
sum1 += i
print("sum1:", sum1)
2. 求1-100的和
sum1 = 0
for i in range(101):
sum1 += i
print("sum1:", sum1)
3. 用函数的方式编程(n可以随意改变,适合所有类似的需求)
def getSum(n):
sum1 = 0
for i in range(n):
sum1 += i
return sum1
print("sum1:", getSum(n))
3. 函数什么时候需要返回值
1. 为什么需要返回值
- 有一些函数需要这个函数处理一些数据后返回数据给你,比如 math.sqrt(n) ,这个函数会返回 n 的二分之一次方,外界需要这个值去操作其它东西
2. 什么时候需要返回值
求和函数需要一个求出来的和,这个就是需要返回值
def getSum(n):
sum1 = 0
for i in range(n):
sum1 += i
return sum1
4. global关键字
1. 什么是global
- global是一个关键字,这个关键字可以将函数内部的局部变量变成全局变量
1. 这种情况外部不能访问函数内部的局部变量
def getSum(n):
sum1 = 0
for i in range(n):
sum1 += i
print(sum1) --> 这个sum1是不能被外部访问到的
2. 加上global后就能调用了
def getSum(n):
global sum1
sum1 = 0
for i in range(n):
sum1 += i
print(sum1) --> 这个sum1是能被访问到的
2. 什么时候需要global
- 个人很不建议使用global关键字,第3点会讲解
这种外部不能访问函数内部的局部变量情况下可以使用global
def getSum(n):
sum1 = 0
for i in range(n):
sum1 += i
print(sum1) --> 这个sum1是不能被外部访问到的
3. global需要注意的事情
def getSum(n):
global sum1
sum1 = 0
for i in range(n):
sum1 += i
sum1 = 0 --> 这个是外部的变量:sum1
getSum(n)
print(sum1) --> 这个sum1是能被访问到的
一旦外部也有sum1变量的时候,外部的变量的值会被覆盖,而且
5. nonlocal关键字
1. 为什么需要nonlocal
def outer():
num1 = 100
def inner():
num1 = 200
print(num1)
inner()
print(num1)
结果:
200
100
为了解决内嵌函数访问闭包函数的变量推出了nonlocal关键字
2. 使用方式
def outer():
num1 = 100
def inner():
nonlocal num1
num1 = 200
print(num1)
inner()
print(num1)
结果:
200
200
6. 函数的可变参数(可变参数是一个元组传递到函数中)
1. 什么时候需要可变参数
1. 求两个数的和
def getSum(n1, n2):
return n1 + n2
2. 求三个数的和
def getSum(n1, n2, n3):
return n1 + n2 + n3
3. 求四个数的和
def getSum(n1, n2, n3, n4):
return n1 + n2 + n3 + n4
这个时候,我就可以使用可变参数
def getSum(*n1):
sum1 = 0
for item in n1:
sum1 += item
return sum1
2. 可变参数与普通参数混合后的缺点
- 一旦你的可变参数与普通参数混合了,那么就会出现问题
这个结果就会报错,按照我们正常思维三个数求和应该等于 6 才对,但是函数分不清你的参数 3 是 n1 的还是 n2 的
def getSum(*n1, n2):
sum1 = 0
for item in n1:
sum1 += item
return sum1
getSum(1,2,3)
解决这个问题可以将可变参数放在参数列表最后面来解决
def getSum(n1, *n2):
sum1 = 0
for item in n2:
sum1 += item
return sum1
7. 函数参数的默认值
1. 优缺点
- 不容易报错,哪怕你没有写函数的参数
2. 例子
这个时候就可以不写参数也能调用,因为参数有一个默认值 1,但是不建议不写
def max1(n1 = 1):
return n1
print(max1())
如果你在参数中传递 2,那么n1的值就会赋值为 2
def max1(n1 = 1):
return n1
print(max1(2))
8. 不同文件之间的函数的调用
1. 为什么需要不同文件之间函数调用
- 因为你的程序不可能写在一个文件中,而且有时候你需要和别人合作开发项目,这个时候不同文件夹下的函数相互调用就有必要了
2. 调用方式
- 导包import 文件夹名.文件夹名.文件名
- from 文件夹名.文件夹名.文件名 import 模块
9. 局部变量与全局变量
1. 局部变量与全局变量的概念
- 局部变量就是只在某一个代码块中变量(for循环中,函数中,while循环中)
- 全局变量就是在一个文件的任何地方都能访问到的变量
2. 作用域
- 作用域就是你for中的变量你只能在for中访问,外面访问不到
for item in range(10):
num1 = 1
print(num1) --> for语句的外面就访问不到for语句中的num1,
这个for语句的语句块就是num1的作用域
3. LEGB
- L:local 函数内部作用域
- E:enclosing 函数内部与函数内部内嵌函数之间
- G:global 全局作用域
- B:build-in 内置作用域(比如list、tuple)
4. 变量查找顺序
- 变量查找只能从内部往外部找
10. 内嵌函数与闭包
1. 什么是内嵌函数
- 一个函数内部定义的函数(fun2函数)
def fun1():
print("fun1 ing")
def fun2():
print("fun2 ing")
fun2() # 内嵌函数的定义和调用都必须在外层函数中
fun1()
2. 什么是闭包
- 闭包就是外面这层函数(fun1函数)
3. 内嵌函数的使用
- 内嵌函数只能在函数的内部使用
11. lambda表达式与匿名函数
格式
lambda 参数列表...:返回值
使用lambda表达式进行两数求和
sum1 = lambda x1,x2: x1 + x2
12 类的重写与重载
- Python中没有重载
- 重写后面的会覆盖前面的
13 函数的参数
- *args可变参数 *args==tuple
- **args字典 **args==dict
*args参数:可变参数
def go(*args):
for i in args:
print(i)
**args参数:可变参数另一种风格
def gogo(**args):
print(type(args))
for i in args.values():
print(i)
gogo(key=value, key=value)
gogo(**{"name":"Luo","age":22})
字典参数特点
- 关键字参数会转换成字典的形式
- 字典参数一定要在普通参数后面
14 位置参数与普通形式参数
def test(x,y):
pass
test(1, 2)
test(x=1, y=2)
test(1, y=2)
位置参数特点
- 位置参数必须在普通形式参数右边
- 普通形式参数不能乱序
网友评论