为什么要用函数?
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在传参时,传递的是引用