1.函数是什么?
函数一词来源于数学,但编程中的[函数]概念,与数学中的函数是有很大不同的
编程中的函数在英文中也有很多不同的叫法,在BASIC中叫做subroutine(子过程或子程序)
,在pascal中叫做procedure(过程)和function,在c中只有function,在Java里叫
做method。
函数能提高应用的模块性,和代码的重复利用率。你已经知道python提供了许多内建函数
,比如print(),但你也可以自己创建函数,之被叫做用户自定义函数。
定义:函数是指将一组语句的集合通过一个名子(函数名)封装起来,要想执行这个函数,
只有调用其函数名即可。
特性:
1.代码重置
2.保持一致性
3.可扩展性
函数的创建:
格式:
python定义函数使用def关键字,一般格式如下:
在这里插入代码片def 函数名 (参数列表) :
函数体 <br><br>
def hello():
print('hello')
hello()#调用
函数名的名命规则:
函数名命必须以下划线或字母开头,可以包含任意字母、数字或下划线组合。
不能使用任何标点符号:
函数名是区分大小写的。
函数名不能是保留字。
形数和实参:
形参:形式参数,不是实际存在,是虚拟变量。在定义函数和函数体的时候使用形参
目的是在函数调用时接受实参 (实参个数,类型应与实参一一对应)
实参:形式参数,调用函数时传给函数的参数,可以是常量、变量,表达式,函数传给参数
区别: 形参是虚拟的,不占用内存空间,形参变量只有在被调用时才分配内存单元,
实参是一个变量,占用内存空间,数据传送单向,实参传给形参,不能形参传给实参.
在这里插入代码片
import time
time=time.strftime('%Y--5m--%d')
def f(time)
print('Now time is : %s'%times')
f(times)
3.函数的参数:
必备参数
关键字参数
默认参数
不定长参数
在这里插入代码片
def logger (log_text):
f = open("log.txt",'a')
f.write("2016-08-25 15:24 %s" % log_text)
f.close()
print(log_text)
函数 != function()
计算机函数 == subroutine 子程序 ,procedures 过程
作用:
1.减少重复代码
2.方便修改,更易扩展
3.保持代码的一致性
print("----function 1")
logger("2016-08-25 15:24 exec function 1")
#
#
print("----function 2")
logger("2016-08-25 15:24 exec function 2")
#
print("----function 3")
logger("2016-08-25 15:24 exec function 3")
def f(): # 形参
print('ok')
f() #调用一定记得加括号
def f(index):
print('function %s'%index)
f(5) # 调用一定记得加括号
def add(b,a): #按顺序对应
print(a)
print(b) # 实参
add(7,5)
在这里插入代码片实例1:
def show_shopping_car():
saving=1000000
shopping_car=[
('Mac',9000),
('kindle',8000),
('tesla',100000),
('python book',105),
]
print('您已经购买的商品如下'.center(50,'*'))
for i,v in enumerate(shopping_car,1):
print('\033[35;1m %s: %s \033[0m'%(i,v))
expense=0
for i in shopping_car:
expense+=i[1]
print('\n\033[32;1m您的余额为 %s \033[0m'%(saving-expense))
show_shopping_car()
在这里插入代码片实例2:
现在我们就用一个例子来说明函数的三个特性:
def action1(n):
print ('starting action1...')
with open('日志记录','a') as f:
f.write('end action%s\n'%n)
def action2(n):
print ('starting action2...')
with open('日志记录','a') as f:
f.write('end action%s\n'%n)
def action3(n):
print ('starting action3...')
with open('日志记录','a') as f:
f.write('end action%s\n'%n)
action1(1)
action2(2)
action3(3)
------------------------------------------代码重用
在这里插入代码片def logger(n):
with open('日志记录','a') as f:
f.write('end action%s\n'%n)
def action1():
print ('starting action1...')
logger(1)
def action2():
print ('starting action2...')
logger(2)
def action3():
print ('starting action3...')
logger(3)
action1()
action2()
action3()
------------------------------------可扩展和保持一致
在这里插入代码片加上时间
import time
def logger(n):
time_format='%Y-%d %X'
time_current=time.strftime(time_format)
with open('日志记录','a') as f:
f.write('%s end action%s\n'%(time_current,n))
def action1():
print ('starting action1...')
logger(1)
def action2():
print ('starting action2...')
logger(2)
def action3():
print ('starting action3...')
logger(3)
action1()
action2()
action3()
必须参数:
必须参数须与正确的顺序传入函数。调用时的数量必须和声明时的一样。
在这里插入代码片def f(name,age):
print('I am %s,I am %d'%(name,age))
f('huage',18)
f('didi',12)
关键字参数:
在这里插入代码片def f(name,age):
print('I an %s,I am%d'%(name,age))
# f(16,'huage')#报错
f(age=16,name='huage')
默认参数:
调用函数时,缺省参数的值如果没有传入,则被认为是默认值。下列会打印
默认的age,如果age没有被传入:
在这里插入代码片def print_info(name,age,sex='male'):
print('Name:%s'%name)
print('age:%s'%age)
print('Sex:%s'%sex)
print_info('华哥',18)
print_info('龙龙',20,'female')
不定长参数:
你可能需要一个参数能处理比当初声明时更多的参数。这个参数叫做
不定长参数,和上述两种参数不同,声明时不会名命。
在这里插入代码片def add(x,y):
return x+Y
def add(*tuples):
sum=0
for v in tuples:
sum+=v
return sum
print(add(1,2,3,4))
print(add(2,6,3,6))
在这里插入代码片
low 加法器
def add(x,y,z):
print(x+y+z)
add(1,2,3)
add(2+3)
高大尚
def add(*haha):
print(haha)
sum=0
for i in haha:
sum+=i
print(sum)
add(1,2,3,4,5)
加了星号(*)的变量名会存放所有未命名的变量参数。而加(**)
的变量名会存放命名的变量参数.
在这里插入代码片def print_info(**kwargs):
print(kwargs)
for i in kwargs:
print('%s:%s'%(i,kwargs[i]))#根据参数可以打印任意相关信息了
return
print_info(name='alex',age=18,sex='female',hobby='girl',nationality='Chinese',ability='Python')
#######################位置
def print_info(name,*args,**kwargs): #def print_info(**kwargs,**kwargs,*args):报错
print('name:%s'%name)
print('args:',args)
print('kwargs:',kwargs)
repr
print_info('alex',18,hobby='girl',nationality='chinese',ability='python')
print_info(hobby='girl','alex',18,nationality='Chinese',ability='Python') #报错
print_info('alex',hobby='girl',18,nationality='Chinese',ability='Python') #报错
注意,还可以这样传参:
在这里插入代码片def f(*args):
print(args)
f(*[1,2,5])
def f(**kargs):
print(kargs)
f(**{'name':'alex'})
高阶函数时至少满足下列一个条件的函数:
接受一个或多个函数作为输出
输出一个函数
在这里插入代码片def add(x,y,f):
return f(x) + f(y)
res = add(3,-6,abs)
print(res)
############################
def foo():
x=3
def bar():
return x
return bar