一、函数简介
什么是函数:
-
其实就是一段代码,这段代码可以重复的执行,通过函数可以实现代码的复用
-
函数是不能自己主动执行的,必须被调用的时候才能被执行
python的模块
-
一个python文件的,就是一个模块
函数分类
-
全局函数:直接定义在模块中的函数就是全局函数
-
局部函数:定义在函数内部的子函数,这样的函数就是局部函数
-
匿名函数: 也称之为lambda函数,其实是一个表达式
-
方法:方法也是一种函数,只是函数需要和特点的数据类型绑定使用
定义函数
def 函数名(): 语句 语句 ...
调用函数
函数名()
案例:
# 定义一个函数
# 函数名是f1
def f1():
print("1")
print("ok")
print("2")
print("start process...")
# 调用函数
f1()
print("over")
执行函数的结果
-
函数的输出:在函数中用print来输出一个结果,这个可以可以直接显示
-
输出用:print
-
输出结果:可以直接打印出来
-
-
函数的返回值:在函数中用return 来返回一个或者多个结果,这个结果可以用来接收,一旦执行到return,那么return后面的代码就不会再执行了,也就是会直接退出函数,返回到主程序继续运行
-
返回用:return
-
返回值:可以再主程序进行接收,如果返回多个值,那么多个值会保存成一个元组
-
案例:用函数计算两个数字的和
# =================方法1:在函数中用print显示执行结果================
# 定义函数
def fun1():
num1 = int(input("请输入数字:"))
num2 = int(input("请输入数字:"))
sum = num1 + num2
# 将求和的结果打印输出
print(sum)
print("启动.....")
# 调用函数
fun1()
print("结束.....")
#=================方法2:在函数中用return返回执行结果================
# 定义函数
def fun1():
num1 = int(input("请输入数字:"))
num2 = int(input("请输入数字:"))
sum = num1 + num2
# 将求和的结果返回到主程序
return sum
print("启动.....")
# 调用函数
# 如果函数有返回值的话,那么在调用函数的时候,就必须用变量来接收这个返回值
res = fun1()
# 打印函数的返回值
print(res)
print("结束.....")
补充:
在使用函数的时候,一旦函数执行到了return那么,函数中,return后面的代码就不会再继续执行了
函数中,如果返回值有多个,那么这多个返回值会组合成一个元组
函数的说明文档
-
一般情况先,每个函数都应该有个说明文档,来解释这个函数的作用以及使用方法
-
查看函数的说明文档的方法
函数名.__doc__
案例:
def f1():
"""
这是我们的一个测试函数,函数的没有输出,但是有返回值,返回是3
这个函数有xxxx
欢迎使用这个
.....
:return:
"""
name = "tom"
age =3
addr = "hebei"
return name,age,addr
print(f1.__doc__)
二、变量的作用域
-
本地变量:定义在模块中的【主程序中的变量】,有效范围是整个python文件,包括主程序和函数内部
-
局部变量:在函数中定义变量,默认有效范围仅仅在函数内部
-
内置变量:由python自己定义的
注意事项:
-
变量的作用范围越小,优先级越高
-
局部变量优先级 > 本地变量
-
修改局部变量,不会修改全局变量
-
程序找变量的过程
-
首先找最近的变量的,如果有就直接使用;如果没有,就向上层查找
-
def f1():
x = 2 # 局部变量
z = 5 # 局部变量
print(x,y,z)
x = 1 # 全局变量
y = 3 # 全局变量
print(x,y) # 输出 x 是 1,y 是 3
f1() # 将 x 改为 2,z 设置为5 ,然后输出x y z 也就是输出 2 3 5
print(x,y) # 输出 x 和 y, 此时 x 是 1,y 是 3
默认情况下:函数中的变量是局部变量,但是可以用关键字:global将变量明确指定成全局的
x = 1 # 全局变量
y = 3 # 全局变量
def f1():
x = 2 # 局部变量
z = 5 # 局部变量
global y # 全局变量【将局部变量y转换为全局变量】
y = 0 # 为转换后的全局变量赋值 0
print(x,y,z)
return 3
global x
x = 0
print(x,y) # 输出 x 是 1,y 是 3
f1() # 将 x 改为 2,z 设置为5 ,然后输出x y z 也就是输出 2 3 5
print(x,y) # 输出 x 和 y, 此时 x 是 1,y 是 0
三、函数传递参数
def 函数名(变量): 代码
案例1:定义一个函数,实现像函数传递两个数字,自动计算这两个数字的计算结果
# 定义函数
# 函数名后面的括号中的内容称之为 形参,其实就是一个变量而已
# 如果函数有形参,那么在调用函数的时候,就必须为每个形参传递一个值
def fun1(num1, num2):
sum = num1 + num2
print(sum)
# 调用函数
# 调用函数的时候,函数名后面括号中的内容是 实参
# 实参的个数必须和定义函数时候形参的数量保持一直
# 每个实参,会逐一赋值给每个形参
fun1(3,5)
fun1(3,6)
fun1(2,7)
案例2:定义函数,向函数传递两个数字和一个符合,实现计算器的功能在
# 定义函数
# 函数名后面的括号中的内容称之为 形参,其实就是一个变量而已
# 如果函数有形参,那么在调用函数的时候,就必须为每个形参传递一个值
def fun1(num1, num2, opt):
if opt == '+':
sum = num1 + num2
elif opt == '-':
sum = num1 - num2
elif opt == '*':
sum = num1 * num2
elif opt == '/':
sum = num1 / num2
print(sum)
# 调用函数
# 调用函数的时候,函数名后面括号中的内容是 实参
# 实参的个数必须和定义函数时候形参的数量保持一直
# 每个实参,会逐一赋值给每个形参
fun1(3,5,'+')
fun1(3,6,"*")
fun1(2,7,"-")
fun1(8,2,"/")
参数的默认值:
-
如果函数要求传递参数,但是调用的时候没有传递,那么就会报错
案例1:
def printWellcome(name="jack"): # name = “jack“ 这是为参数设置默认值
print("hello %s"%(name))
userInput1 = input("请输入姓名:")
printWellcome() # 调用函数,没有向函数传递参数,此时函数会使用参数的默认值
printWellcome(userInput1) # 调用函数,向函数传递参数,此时函数会使用传递进来的参数
案例2:函数有四个参数,name,age,tel、addr,要求必须 传递name和age,tel和addr两个参数可以不传递,如果用户没有给tel和addr传递参数,默认用nul
def printWellcome(name, age, tel="nul", addr="nul"):
print("姓名是%s, 年龄是%s, 电话是%s, 地址是%s"%(name,age,tel,addr))
userInput1 = input("请输入姓名:")
userInput2 = input("请输入年龄:")
userInput3 = input("请输入电话:")
userInput4 = input("请输入地址:")
printWellcome(userInput1,userInput2)
printWellcome(userInput1,userInput2,userInput3)
printWellcome(userInput1,userInput2,userInput3,userInput4)
基于关键字来进行传递参数
-
要求:定义函数时候参数的名字必须和调用时候参数的名字一直
-
格式
# 定义函数
def fun1(p1,p2,p3="nul"): # 此时参数的名字分别是p1 p2 p3
# 调用函数
fun1(p1=xx,p2=xx) # 此时必须明确指定p1=x p2=x p3=x
案例:
def fun1(p1,p2,p3="nul"):
if p3 == "nul":
print("姓名是 %s, 年龄是%s"%(p1,p2))
else:
print("姓名是 %s, 年龄是%s, 地址是%s" % (p1, p2, p3))
uname = input("name:")
uage = input("age:")
uaddr = input("addr:")
fun1(p2=uage,p1=uname)
总结
1)定义函数
def 函数名():
代码
2)调用函数
函数名()
3)函数的执行结果
第一种:直接在函数中用print输出结果
第二种:在函数中用return返回结果给主程序,在主程序中必须用一个变量来接收返回结果
4)变量作用域
类型:全局变量、局部变量
在主程序中定义的变量是全局变量,在函数中定义的变量的是局部变量
通过使用global关键字可以将局部变量变成全局变量
在主程序中,仅仅可以使用全局变量,在函数中可以使用全局和局部变量
5)函数传参
概念:形参和实参
一般要求形参和实参的个数要保持一致,除非形参是有默认值的
一般要求实参和形参必须保持顺序是一致的,除非在调用函数的时候明确指定每个形参的值
四、传递任意个参数
-
魔法赋值
方法1 def fun1 (*参数)
-
此方法用于接受任意个参数,得到的是一个元组
def fun1(*p1):
print(p1) # p1用于接收和保存传递进来的多个参数,多个参数是以元组的形式保存的
fun1()
fun1("a")
fun1("a","b") # 向函数传递多个参数
方法2 def fun2 (**参数)
-
此方法用于接受任意个参数,得到的是一个字典
def fun1(**p1):
print(p1) # p1用于接收和保存传递进来的多个参数, 数据是以字典的形式保存的
fun1()
fun1(name="tom")
fun1(name="tom", age="18")
fun1(name="tom", age="18", addr="hebei")
向函数来传递列表和字典
-
传递列表
def fun1(*p1): # 如果想通过列表来传递参数,那么形参需要这样写
print(p1)
li = ["tom","jerry",18,136666,"jack"]
fun1(li) # 将列表当成一个整体,传递给函数
fun1(*li) # 将列表中的每个元素单独作为一个元素传递到函数中
传递
字典
def fun1(**p1): # 如果想通过列表来传递参数,那么形参需要这样写
print(p1)
d1 = {"name":"tom","age":18,"addr":"hebei"}
fun1(**d1) # 将列表中的每个元素单独作为一个元素传递到函数中
案例:编写一个函数,输入三个数,输出最大值
import sys
def com(x,y,z):
maxNum=x;
if y>maxNum:
maxNum=y;
if z>maxNum:
maxNum=z
return maxNum
a=input("please input first number:",)
b=input("please input second number:",)
c=input("please input third number:",)
m=com(a,b,c)
print("a,b,c中最大值为:",m)
案例:统计字符串中不同字符的个数
import sys
def deal_char(li):
list=[]
# list.append(float(max(li)))
# list.append(float(min(li)))
upper=0
lower=0
num=0
other=0
# str.__len__()
for i in range(li.__len__()):
if li[i].isupper():
upper+=1
elif li[i].islower():
lower+=1
elif li[i].isnumeric():
num+=1
else:
other+=1
list.append(upper)
list.append(lower)
list.append(num)
list.append(other)
print("list:",list)
return tuple(list)
if __name__=="__main__":
# print("请输入一个序列:")
# while
ll=input("please input some char(or a string):",)
# print(type(lll))
deal=deal_char(ll)
print("tuple contain count with upper char,lower char ,number and others:",deal)
总结
1、定义和调用
# 定义 def 函数名(参数,...): 代码 代码 # 调用 函数名()
2、函数的输出和返回
函数中输出内容:
-
在函数中直接通过print进行输出
函数的返回值:return
-
函数一旦执行到return,函数后面的部分就不会再执行
-
在主程序中,可以通过一个变量来接收函数的返回值
-
函数的返回值如果有多个值,那么这多个值会保存成一个元组
3、变量作用域
-
全局:变量的有效范围是整个python模块
-
局部:变量的有效范围是一个特定的函数的内部
作用域的特点
-
在函数中,定义变量,默认都是局部变量
-
在函数中定义全局变量,可以用global进行定义【不建议这么左】
4、参数传递
-
根据位置变量传递参数
-
根据关键字传递参数
-
可选参数:函数的参数有默认值,那么这个参数激素可选参数
-
传递列表
-
传递字典