05-Python函数

函数定义与调用

函数由以下几个部分组成:

  • 函数名
  • 函数参数
  • 函数体
  • 返回值

定义一个函数:

def showMyName(name):       #定义函数
   print(name)
showMyName("张三")          #调用函数

解释:

  • 使用def定义一个函数
  • showMyName为函数名
  • name为形参,"张三"为实参
  • 函数头以冒号 : 结尾
  • 使用缩进区分函数体
  • 上例函数没有返回值。

返回值

什么是返回值?

如:

a=int(4.5)

解释:

  • int(4.5)就是一个函数,返回值为4
  • 所以a得到的值为4
应用:
def sum(a,b):
   return a+b
print( sum(1,2) )       #输出3

解释:

  • 通过return来返回结果
  • 默认返回None(省略return则返回None)
返回多个值
def func1():
   return 1,2,3,4      #将返回一个元组
返回一个函数
  • 函数名是一个变量,保存着函数的地址,所以函数可以进行赋值操作
  • 所以函数可以作为返回值
def func1():
   print("hello")
def func2():
    return func1    #返回一个函数
func2()()           #输出hello

函数参数

形参与实参

函数参数分为形参实参
形参是一个变量,而形参是一个值

比如:

def sum(a,b):
   return a+b
print( sum(1,2) )       #输出3

解释:

  • a和b是变量
  • 1和2是值
  • 1和2按照顺序赋值给了a和b(称为传参)
函数作为参数
  • 函数名是一个变量,保存着函数的地址,所以函数可以进行赋值操作
  • 所以函数可以作为实参传给实参
def func1(func):
   func()
def func2():
    print("hello")
func1(func2)    #输出:hello
可变对象与不可变对象

传入可变对象:

def func1(a):
   a[0]=100    #原列表将被改变
list1=[1,2,3]
func1(list1)    #调用函数
print(list1)    #输出[100, 2, 3]

传入不可变对象:

def func1(a):
   a=100       #实参不会被改变
b=1
func1(b)    #调用函数
print(b)    #输出1

解释:

  • 可以看到,形参能够改变可变对象中的值,但是不能改变不可变对象的值
  • 原因是:可变对象传入的是地址,形参与实参指向的是同一块内存空间,并且可以直接操作这一块内存空间。
  • 可变对象:字典、列表等类型
  • 不可变对象:数字、字符串、元组等类型
必需参数
  • 必需参数须以正确的顺序传入函数。调用时的数量也必须和声明时的一样
def func1(str):
   print("hello")
func1()     #无参数,则报错!!!
关键字参数
  • 传入参数时,使用形参名与实参一一对应,这时传入参数的顺序可以不一致。
def func1(a,b,c):
   print(a,b,c)
func1(b=2,a=1,c=3)      #输出:1 2 3

比如:

f=open("test.txt","r",encoding="UTF-8")      #encoding="UTF-8"就使用了关键字参数
默认参数

调用函数时,如果没有传递参数,则会使用默认参数

def func1(name,age=18):
   print(name,age)
func1("张三")     #使用默认值,输出:张三 18
func1("张三",20)  #覆盖默认值,输出:张三 20

注意:

  • 拥有默认值的参数必须写在后面
  • 下面的例子会报错:
def func1(age=18,name):	 #默认参数写在了前面,报错!!!
   print(name,age)
不定长参数

加了星号 * 的参数会以元组(tuple)的形式导入

def func1(a,*b):
   print(b)
func1(11,22,33)  #输出:(22, 33)

加了两个星号 ** 的参数会以字典的形式导入

def func1(a,**b):
   print(b)
func1(11,b1=22,b2=33)  #输出:{'b1': 22, 'b2': 33}

不定长参数需要写在形参的最后

如:

def function(name,sex='male',*args,**kwargs):	#关键参数、默认参数、*args和**kwargs为不定长参数
	print("Hello World!")
function("郭飞","男","a","b","c",爱好="拯救宇宙")		#函数调用

各参数的值:

name	"郭飞"
sex	"男"
args	('a', 'b', 'c')
kwargs	{'爱好': '拯救宇宙'}

递归函数

函数内部直接或间接调用函数本身,则该函数称为递归函数。

UTOOLS1590393634682.png

递归函数的特点:

  • 直接或间接调用函数本身。
  • 有结束逻辑。(即停止调用的逻辑)

一定要有结束的逻辑,不然就会无限循环调用自己。

示例-计算阶乘n!

def Leo(n):
    sum = 1
    if 1 == n:        #递归终止条件(结束逻辑)
        return 1;
    sum = n * Leo(n - 1)
    return sum        #返回阶乘的总和
num=input("请输入一个数字:")
num=int(num)
print( Leo(num) )  #输出该数的阶乘

解释:

在求X的阶乘时,可以利用递归的思想:把大问题转化成小问题,再把小问题转化成更小的问题,最后得解。


Python内置函数

help(time)             #打印关于模块time的帮助(需要导入模块)
exit()                 #退出程序
exit("程序已退出")      #退出时输出提示
exit(1)                #退出码为1(退出码为0的时候是正常)
isinstance([1,2],list) #判断数据是否为list
type(name)             #查看变量的类型
type(a) is list        #a为列表则返回True
range(100)     #0到99
range(1,100)   #1到99
range(1,100,2) #1到99里的奇数(2为步长)
id(a)          #查看变量a的地址
chr(65)        #将整数转为ASC-II
ord('a')       #将一个字符转换为它的整数值 (结果为97)
hex(15)        #将一个整数转换为一个十六进制字符串 (结果为0xf)
oct(10)        #将一个整数转换为一个八进制字符串 (结果为0o12)
abs(3+4j)      #求绝对值 (结果为5.0)

装饰器

  • 装饰器用于给函数添加新的功能,比如Debug
  • 装饰器不必修改原函数,就可以给原函数添加新的功能

原函数:

def now():
    print("2018-01-01")  #只输出这一行
now()

原函数结果:

2018-01-01

使用装饰器:

#装饰器
def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__ ) # 输出函数名
        	return func(*args, **kw)
    return wrapper
#加装饰器后
@log    #相当于now=log(now)
def now():
    print('2018-01-01')
#调用函数
now()

使用装饰器的结果:

call now():
2018-01-01

解释:

  • 可以看到在原函数上加了@log之后,就添加了函数log的功能。
  • 不需要此功能时,删除@log即可。
  • 装饰器是使用函数嵌套实现的,至于具体逻辑,麻烦自己看看吧~ 文字实在表达不清楚(图也懒^^),看不懂的直接找我吧~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章