Python函数

1.创建函数

以'def'关键字开始,后边是函数名称,圆括号内是参数,后跟冒号,return返回,不写ruturn返回 None。

def Greet(name):
    print("Hello "+name)

Greet("Python")

输出:
Hello Python

 

1.1 一些重要的函数属性

def Greet(name):
    "Greet说明:文档化函数"
    print("Hello "+name+"\n")

Greet("Python")


print(Greet.__doc__)#返回函数的文档字符串
print(Greet.__name__)#返回函数名字
print(Greet.__module__)#返回函数定义所在模块的名字

输出:
Hello Python
Greet说明:文档化函数
Greet
__main__

1.2 参数

1.2.1 关键字参数和默认值
#使用关键字参数可以忽略参数顺序
#位置参数可以和关键字参数联合使用,但是位置参数必须放在关键字参数前面。
def hello(gretting,name,pun="!"):
    print("%s ,%s%s" % (gretting,name,pun))
hello("Hello","Bob")
hello(name = "world",gretting = "Hello")#关键字
hello("Hello","Bob",pun=".")

输出:
Hello ,Bob!
Hello ,world!
Hello ,Bob.
1.2.2 收集参数
def func3(title,*params):
    print(title)
    print(params)
func3("title","Testing","Testing2","Testing3")

输出:
title
('Testing', 'Testing2', 'Testing3')

#可以看到参数前的星号将所有值放在同一个元组中,星号的意思就是收集其余位置的参数,如果不提供,就是个空元组。

# "**"处理关键字参数 返回字典
def print_params(**params):
    print(params)

print_params(x=1,y=2,z=3)

输出:
{'x': 1, 'z': 3, 'y': 2}

联合使用示例:
# "**"处理关键字参数
def print_params(param1,param2,param3=7,*params4,**params5):
    print(param1,param2,param3)
    print(params4)
    print(params5)

print_params("pa1","pa2","pa3","pa4","pa5","pa6",name="Bob",age=18,sex="")

输出:
pa1 pa2 pa3
('pa4', 'pa5', 'pa6')
{'sex': '', 'name': 'Bob', 'age': 18}
1.2.3 收集参数的逆过程
def add(x,y):
    return x+y

params=(1,2)

print(add(*params))

输出
3

def printUserInfo(**params):
    print(params)

params2 = {"name":"bob","age":20,"sex":""}
printUserInfo(**params2)

输出:
{'sex': '', 'name': 'bob', 'age': 20}

2.作用域

x=1#全局变量
def func():#每个函数调用都会创建一个新的作用域
    x=3

func()#不会影响全局变量,全局变量名做参数名也没有问题
print(x)

输出:
1
如果局部变量或者参数的名字和想要访问的全局变量名相同,全局变量会被局部变量屏蔽,如果需要访问使用globals()["变量名"]获取
par = "thon"
def combie(par):
    print(par+globals()["par"])

combie("py")

输出:
python

重绑定全局变量

x=1
def change():
    global x
    x=x+1
change()
print(x)

输出:
2

3.其他

嵌套作用域,Python的函数是可以嵌套的

def foo():
    def bar():
        print("Hello")
    bar()

闭包

#闭包包含自由(未绑定到特定对象)变量;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。(引用百度百科)

def foo(fac):
    def bar(num):
        return num*fac
    return bar

double = foo(2)
print(double(3))

tri = foo(5)
print(tri(6))

print(foo(7)(8))

输出:
6
30
56

递归

#阶乘
def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n-1)

print(factorial(5))

输出:
120

#
def power(x,n):
    if n == 0:
        return 1
    else:
        return x * power(x,n-1)

print(power(2,3))

输出:
8

lambda表达式(匿名函数)

#Python对匿名函数的支持有限,只有一些简单的情况下可以使用匿名函数。

sum = lambda  x, y : x + y

"""
相当于:
def f(x,y):
    return x + y
"""

print(sum(2, 3))
输出
5

 

 
 
 
 
 
posted @ 2017-09-09 02:44  __Altair  阅读(667)  评论(0编辑  收藏  举报