python基础 函数 (四)

一  函数基本

def func1():
    print("hello world")
    return 1, "hello", ("wo", "ai"), ["ni", "da"], {"you": "xi"}   # return 可以返回任意
    # 结果: (1, 'hello', ('wo', 'ai'), ['ni', 'da'], {'you': 'xi'})
#    return func1  # 返回函数的内存地址
   # 结果: <function func1 at 0x7f32184adf28>

print(func1())

 

# 总结:
#  返回值数:=0,返回None
#  返回值数:=1,返回对象object
#  返回值数:>1,返回元组

 

二  函数形参和实参

def test1(x, y): #  x, y  叫做 形参
    print(x)
    print(y)
    
test1(1, 2)   # 1,2  叫做  实参     与形参位置一一对应
test1(x=1, y=2)   # 打印结果一样
test1(y=2, x=1)   # 打印结果一样    与形参顺序无关
# test1(x=1, 2)  # 报错   关键参数是不能写在位置参数前面的
test1(1, y=2)    # 不报错
# test1(1, x=1)    # 报错

def test2(x, y, z):
    print(x, y, z)
    
test2(1, y=2, z=3)
test2(1, z=3, y=2)  # 结果与上面一样
#test2(1, x=1, z=2)   # 报错,x位置赋予了两个值

def test3(x, y=2):   #  y 是默认参数
    print(x, y)

test3(1)  # 打印  1,2
test1(1,3)  #打印 1,3
test3(1, y=3)  #打印 1,3

# 注:默认参数的特点,在调用的时候,可有可无
# 用途:默认安装软件

 

 

三  数组参数

def test4(*args):  #*args ===   args = tuple([])   # 接受位置参数
    print(args)   # 返回元组
    
test4(1,2,3,4)  # 打印: (1,2,3,4)
test4(*[1,2,3,4])  # 打印: (1,2,3,4)


def test5(x, *args):   # 混合参数
    print(x)
    print(args)
    
test5(1,2,3,4,5,6)
# 打印结果:
# 1
# (2,3,4,5,6))

 

 

四  字典参数

def test6(**kwargs):   # 接受字典的形式,  把关键字参数,转化为字典
    print(kwargs)   #   返回字典

test6(name="sam", age=28)    # 结果:{'name': 'sam', 'age': 28}
test6(**{'name': 'sam', 'age': 28})  # 结果一样

def test7(name, **kwargs):
    print(name)
    print(kwargs)
    
test7('sam')
# 结果
# sam
# {}

# test7('sam', 'yong') # 报错,因为只能接受一个位置参数, 而kwargs只接受关键字参数
test7('sam', name="sam", age=28)
# 结果
# sam
# {'name': 'sam', 'age': 28}


def test7(name, age=12, **kwargs):
#def test7(name, **kwargs, age=12):  # 报错
    print(name)
    print(age)
    print(kwargs)
    
test7('sam', addr='beijing', phone=123456)  # 
# 结果
# sam
# 12
# {'addr': 'beijing', 'phone': 123456}

test7('sam', age=3, addr='beijing', phone=123456) 
test7('sam', 3,  addr='beijing', phone=123456) 
test7('sam', addr='beijing', phone=123456, age=3) 
# test7('sam',23, addr='beijing', phone=123456, age=3)  # 报错,age 多值错误
# 以上结果都一样
# sam
# 3
# {'addr': 'beijing', 'phone': 123456}

def test8(name, age=12, *args, **kwargs):
    print(name)
    print(age)
    print(args)
    print(kwargs)

test8('sam', age=3, addr='beijing', phone=123456) # 位置参数一定要写在关键字参数的前面
# 结果
# sam
# 12
# ()
# {'addr': 'beijing', 'phone': 123456}

 

 

五  局部变量 和 全局变量

 

name = "sam"
def func1():
    print(name)
#   name = "jey"  # 程序会报错  UnboundLocalError: local variable 'name' referenced before assignment
func1()
# 结果
# sam

 

name = 'sam'
def chname(name):
    print("before change name:", name)
    name = 'jey'   # 这个变量的作用域只在这个函数中
    print("after change name:", name)

chname(name)
print(name)  # sam   没有变
# 结果
# before change name:sam
# after change name:jey
# sam

 

如果要在函数中修改全局变量,使用global 申明变量

name = 'gao'
def testname():
    global name   # 引用全局变量   最佳实践  global 不要用
    print(name)   # gao
    name = 'shao'
    print(name)   # shao

testname()    
print(name)  # shao 改变了

 

# 注:只有数字,字符串 不能再函数中改,但是,列表,字典,集合能改

names = ['sam', 'jey', 'snow']

def test9():
    print(names)
    name[0] = 'sammy'
    print(names)
    
test9()
print(names)
# 结果
# ['sam', 'jey', 'snow']
# ['sammy', 'jey', 'snow']
# ['sammy', 'jey', 'snow']

 

posted @ 2017-08-20 21:50  北风之神Sam  阅读(193)  评论(0)    收藏  举报