一、什么是函数
函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码段,它能够提高应用的模块化和代码的重复利用率。
#演示函数的定义与使用
def prt():
print("*")
print("***")
print("*****")
return 1
prt() #函数的调用
#调用同文件的函数,只需要在函数下方写函数名,传对应参数,即可调用
#调用不同文件的函数,需要先导入:from 文件路径 impo 函数名/*
a=prt()
print(prt())
二、函数的定义和调用
定义函数
Python使用def关键字定义函数,语法格式如下:
def 函数名(参数列表):
" 函数_文档字符串"
函数体
return 表达式
三、函数的参数
- 函数参数的传递
如果希望定义的函数可以计算任意两个数的和,我们在定义函数的时候,让函数接收数据,这就是函数的参数。
def add (a, b):
c = a + b
print(c)
a和b就是函数的参数,它们可以可以接收调用函数时传入的任意两个数。
举例:
#带参函数
def add(a,b):#形式参数
print(a+b)
add(11,13) #实际参数,必须只能带相同类型的字符(int,float,str)
def add(a,b):
print(a+b)
a+=1
b+=2
c=12
d=41
add(c,d)
print(c,d) #只是传值,不会改变值
- 默认参数
定义函数时,可以给函数的参数指定默认值,这个被指定默认值的参数被称为默认参数。
#演示参数默认值
def add(a,b=3):
print(a+b)
add(11,22)#默认值一般在值的范围情况少的时候用,在性别上
#有默认值的参数,可以不赋值,直接使用默认值
#如果对有默认值的参数赋值,该参数的值是新值
#没有默认值的参数不可以定义在有默认值参数之后
- 不定长参数
若希望函数被调用时能够传入比定义时更多的参数,可以在定义函数时使用不定长参数。
加星号(*)的参数args会以元组的形式存放未命名的参数;
加**的参数kwargs会以字典的形式存放命名的参数,即形如key=value的参数。
def 函数名([formal_args,] *args, **kwargs):
"函数_文档字符串"
函数体、
return 表达式
举例:
#演示不定长参数
def add(*a):
sum=0
for x in a:
sum+=x
print(sum)
add(1,2,3,4,5,6,7,8,9) #元组的形式
def add(**a):
for x in a.items():
print(x)
add(a=2,b=3)
#**a 传参方式必须是 key=value的形式
#函数传参的类型的问题
#一般可变长度的参数写在不可变参数前面
def add(*a,b):#a,b都是元组
sum=0
for x in a:
sum+=x
for y in b:
sum+=y
print(sum)
add(1,2,3,b=(4,5,6))
def add(a,b):
for x in range(len(a)):
a[x]+=10
a=[4,5,6]
c=[1,2,3]#集合类型的地址,就是变量的值,只要地址不变,地址内的元素怎么改变都可以
add(c,b=(4,5,6))
print(c)
四、函数的返回值
Python中使用return语句返回结果。
def add (a, b):
c = a + b
return c
函数add中包含return语句,这意味着add函数有返回值,其返回值是a和b相加的结果。
五、函数的四种类型
根据函数的参数和返回值,函数可以分为四种类型:
无参数,无返回值的函数
无参数,有返回值的函数
有参数,无返回值的函数
有参数,有返回值的函数
- 无参数,无返回值的函数
def print_menu():
print('--------------------------')
print(' xx涮涮锅 点菜系统')
print(' 1. 羊肉涮涮锅')
print(' 2. 牛肉涮涮锅')
print(' 3. 猪肉涮涮锅')
print('--------------------------')
print_menu()
- 无参数,有返回值的函数
# 获取温度
def get_temperature():
#为了简单起见,先模拟返回一个数据
return 24
temperature = get_temperature()
print('当前的温度为:',temperature) #当前温度为24
- 有参数,无返回值的函数
有参数、无返回值的函数使用较少,了解即可。
def test(num_one,num_two):
result = num_one + num_two
print('计算结果为:%d'%result)
- 有参数,有返回值的函数
def calculate (num):
result = 0
i = 1
while i <= num:
result = result + i
i += 1
return result
result = calculate (100)
print('1~100的累积和为:', result)
像数据处理且需要处理结果场景可以使用此类函数。
举例:
def nb(name,age):
print("我叫"+name+",今年%i岁了"%age)
return 1
def nba(name,age,gender):
a=nb(name,age)
if a==1:
print("gender",gender)
return 2
b=nba("ww",18,"female")
print(b)
六、函数的嵌套调用
举例:
#函数的嵌套调用(在函数中调用其他函数)
def nb():
print("nbsl")
print("awsl")
print("finish")
def nba():
print("nba is start")
nb()
print("nba is close")
nba()
七、变量作用域
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种。
L(Local):函数内的区域,包括局部变量和参数。
E(Enclosing):外面嵌套函数区域,常见的是闭包函数的外层函数。
G(Global):全局作用域。
B(Built-in):内建作用域。
- LEGB原则
Python中变量是按照L –> E –> G –>B 的顺序查找的。
Python在查找变量的时候会优先去函数内作用域中查找,若没有找到便会到嵌套函数作用域中查找,再找不到就去全局作用域中查找,最后再去内建作用域中查找。
- 局部变量
所谓局部变量,就是在函数内部定义的变量。
局部变量的作用域是函数内部,说明它只在定义它的函数中有效,一旦函数结束就会消失。
- 全局变量
定义在函数外的变量拥有全局作用域。
全局变量可以在整个程序范围内访问。
如果出现全局变量和局部变量名字相同的情况,则在函数中优先访问局部变量。
- global和nonlocal关键字
使用nonlocal关键字可以在一个嵌套的函数中修改嵌套作用域中的变量。
>>> def func():
... count = 1
... def func_in():
... nonlocal count
... count = 12
... func_in()
... print(count)
>>> func()
12
举例:
#演示函数的作用域
name="dawang"
def test(name):
def t(name):
name="大王"
print("t的name",name)
t("小王")
print("test的name",name)
test("xiaowang")
print(name)
八、递归函数和匿名函数
- 递归函数
一个函数的内部可以调用其他函数。但是,如果一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数。
举例:
#演示递归函数(一个函数调用自己)
b=0
def a(b):
b+=1
if b<=10:
print("第%i次调用方法开始" % b)
a(b)
print("第%i次调用方法结束"%b)
a(b)
#使用递归实现阶乘计算
n=int(input("请输入一个整数:"))
result=1
def jiecheng(num,result):
result*=num
num-=1
if(num>=1):
jiecheng(num,result)
if num == 0:
print(n, "的阶乘是:", result)
jiecheng(n,result)
- 匿名函数
匿名函数就是没有名称的函数,也就是不再使用def语句定义的函数。如果要定义匿名函数,则需要使用lambda关键字。匿名函数的定义格式如下所示:
lambda [arg1 [,arg2,.....argn]]:expression
[arg1 [,arg2,...argn]]”表示函数的参数,“expression”表示表达式。
匿名函数示例代码:
sum = lambda a, b: a + b
print(“运行结果:", sum( 10, 20 ))
print("运行结果:", sum( 20, 20 ))
与普通函数相比,匿名函数有很多不同的地方:
普通函数在定义时有名称,而匿名函数没有名称。
普通函数的函数体中包含有多条语句,而匿名函数的函数体只能是一个表达式。
普通函数可以实现比较复杂的功能,而匿名函数可实现的功能比较简单。
举例:
#lambda表达式来定义匿名函数
sum=lambda a,b:a+b
c=sum(1,2)
print(c)
transfrom=lambda *a:list(a)
print(transfrom(1, 2, 3, 4, 5)) #以list打印出来
九、日期时间函数
- 时间函数
在Python中,通常有如下几种方式表示时间:
(1)时间戳;
(2)格式化的时间字符串;
(3)时间元组(struct_time)。
时间戳表示从1970年1月1日00:00:00开始按秒计算的偏移量。
import time; # 引入time模块
ticks = time.time()
print("当前时间戳为:", ticks)
举例:
#演示时间戳
import time
t=time.time()
print(t)
- 格式化的时间字符串
我们可以使用time模块的strftime方法来格式化日期。
import time
# 格式化成2016-03-20 11:45:39形式
print(time.strftime("%Y-%m-%d %H:%M:%S",
time.localtime()))
举例:
import time
print(time.strftime("%Y-%m-%d %H:%M:%S"))
- 日历函数
calendar.calendar(year,w=2,l=1,c=6)
返回一个多行字符串格式的year年年历,3个月一行,间隔距离为c。每日宽度间隔为w个字符。每行长度为21* W+18+2* C。l是每星期行数。
calendar.monthrange(year,month)
返回两个整数,第一个整数是该月星期几的日期码,第二个整数是该月的日期码。日从0(星期一)到6(星期日);月从1到12。
import calendar
rng=calendar.monthrange(2022,2)
print(rng)
十、随机数函数
random.randrang([start], stop[, step])
返回指定递增基数集合中的一个随机数,基数默认值为1。其中,start参数用于指定范围的开始值,其包含在范围内;end参数用于指定范围的结束值,其不包含在范围内;step表示递增基数。
#演示随机数
import random
a=random.randrange(2,20,5)
print(a)