为什么要用函数?
1、增加打码的可读性
2、增强代码的重用,减少重复编写
3、跨平台的可扩展性
函数的定义:
1、函数名、参数(def xxx())
2、函数体
3、返回值
def func1(): #函数名func1,无参数
print (name) #函数体,打印name,无返回值
函数的调用:
name = 'HAHA'
def func1(): #定义函数
print (name)
func1() #调用函数
输出结果:
HAHA
函数的返回值:
return
name = 'HAHA'
def func1():
try:
print (name) #函数体,打印name
except:
return False #当执行失败时,返回False
else:
return True #否则,返回True
ret = func1() #接收函数的执行结果
print (ret)
执行结果:
HAHA
True
当函数中有return时,执行到return后,跳出函数,return后面的内容不会继续执行
def f2():
return "not go ahead"
print (123) #不会被执行
r = f2()
print (r)
执行结果:
not go ahead
函数的参数:
def f3(x): #x为形式参数
print (x) #打印传入的参数
f3('test') #'test'为实际参数,即将test传给x,x=test,实参和形参之间为一一对应关系
运行结果:
test
默认参数:
def f3(name,age=18): #age为默认参数,默认参数必须放在参数列表最后
print (name,age)
f3('s1',15)
f3('s2')
运行结果:
s1 15
s2 18
指定参数:
def f3(name,age=18):
print (name,age)
f3(name='s1',age=15)
f3(age=99,name='s2')
执行结果:
s1 15
s2 99
动态参数:*
def f3(*args): #*将实参作为元祖传递
print (args)
li =[122,3344,5,'asdfsdf',[123123,124345645,'sdfasdf'],{'ss':11,'name':123}]
f3(li) #将li整体作为元祖的一个元素进行传递
f3(*li) #内部循环,将li里的元素作为元祖的元素进行传递
执行结果:
([122, 3344, 5, 'asdfsdf', [123123, 124345645, 'sdfasdf'], {'name': 123, 'ss': 11}],)
(122, 3344, 5, 'asdfsdf', [123123, 124345645, 'sdfasdf'], {'name': 123, 'ss': 11})
动态参数:**
def f4(**kwargs): #**将实参作为字典传递,传值时,必须按照key=value,以指定参数的方式传值
print(kwargs)
f4(s1='s1',s2=999)
test={'s1':'s1','s2':19}
f4(s3=test)
f4(**test) #将test中的每一个元素传入新的字典中
执行结果:
{'s2': 999, 's1': 's1'}
{'s3': {'s2': 19, 's1': 's1'}}
{'s2': 19, 's1': 's1'}
同时存在*和**时:
def f5(*args,**kwargs):
print (args)
print (kwargs)
f5(11,22,33,44,k1='v1',k2='v2') #当实参中,存在键值对时,自动将键值对作为字典传入kwargs,其他的则作为元祖封装给args
执行结果:
(11, 22, 33, 44)
{'k2': 'v2', 'k1': 'v1'}
str format格式化输出:支持2种格式输入(*args和**kwargs):
s = "today is {0},now is {1}".format('2016/11/28','15:22') #{0},{1}称为占位符,依次将值传入
print (s)
s = "today is {1},now is {0}".format('2016/11/28','15:22')
print (s)
s1 = "today is {date},now is {time}".format(**{'date':'2016/11/28','time':'15:24'}) #使用**kwargs时,将字典中的键值对传递按照key值给对应的占位符
print (s1)
s1 = "today is {date},now is {time}".format(date='2016/11/28',time='15:24') #当不使用默认的{0},{1}作为占位符时,传值时,类似于指定参数,需要指定占位符的名称
print (s1)
s2 = "today is {0},now is {1}".format(*['2016/11/28','15:25']) #使用*args时,将列表中的元素,依次传入占位符
print (s2)
s2 = "today is {0},now is {1}".format('2016/11/28','15:25') #等同于*args
print (s2)
执行结果:
today is 2016/11/28,now is 15:22
today is 15:22,now is 2016/11/28
today is 2016/11/28,now is 15:24
today is 2016/11/28,now is 15:24
today is 2016/11/28,now is 15:25
today is 2016/11/28,now is 15:25
python传参,传递的是引用还是重新创建的值?
def f1(a1): #将li传递给a1
a1.append(99) #a1追加元素99
li = [11,22,33,44]
f1(li)
print (li)
#如果是传递的重新创建的值,那么li应该保持不变,为11,22,33,44
#如果是传递的引用,那么li应该变为,11,22,33,44,99
执行结果:
11,22,33,44,99
所以,python在传参时,传递的是引用
4741

被折叠的 条评论
为什么被折叠?



