python函数-1

为什么要用函数?

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在传参时,传递的是引用

猜你喜欢

转载自funny121.iteye.com/blog/2341601