码迷,mamicode.com
首页 > 编程语言 > 详细

python函数

时间:2019-07-10 16:28:12      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:margin   结束   efi   for   内部函数   一个   type   复杂   嵌套   

命名关键字参数

命名关键字参数: # 在函数定义阶段,写在 * 与 ** 之间的参数 

  下面的z 和 m 都是命名关键字参数

def func(x, y=1, *args, z=3, m, **kwargs):
    print(x, y)
    print(args)
    print(z, m)
    print(kwargs)


func(1, 2, 3, 4, [5, 6, 7], m=1, z=3, n=1, q=1, p=2)  # 关键字传参 m = 2
# 要想给m传值, 必须用关键字传值 m = 2,如果直接用位置参数,显然会被 *args接收(截取)
# 调用 func() 返回值如下:
# 1 2
# (3, 4, [5, 6, 7])
# 3 1
# {‘n‘: 1, ‘q‘: 1, ‘p‘: 2}

注意: # 在给命名关键字参数传值的时候 只能用关键字为其传值 , # 在定义阶段 给你感觉好像是z是默认值参数 放在了m这个位置参数的前面了 应该报错,但其实 z 和 m 都不是默认值参数和位置参数, 他们是命名关键字参数  

函数对象

函数是第一对象: # 函数名指向的值可以被当做参数传递 

函数对象的特性

  函数名可以像变量一样被传递

# 变量可以被传递
name = jason
x = name
print(x)
# jason
print(id(name), id(x))
# 3085464224688 3085464224688

# 尝试函数像变量一样被传递
def func():
    print(from func)
print(func)
# <function func at 0x0000016E5E062E18>

f = func  # 其实指向的也是函数func 指向的函数体代码的内存地址
print(f)
# <function func at 0x000001B4D0D92E18>
f()
# from func
print(id(func), id(f))
# 3085463137816 3085463137816

  函数名可以被当做参数传递给其他函数

def func():
    print("from func")

def index(args):
    print(args)
    args()  # 函数主要一定义(先定义)就可以在任意地方调用
    print("from index")

index(func)
# <function func at 0x000001B7429A2E18>
# from func
# from index

  函数名可以被当做函数的返回值

def index():
    print(index)

def func():
    print(func)
    return index

res = func()  # 将返回的函数名index 赋值给变量res
# func
print(res)
# <function index at 0x000001EF64362E18>
res()
# index

  函数名可以被当做容器类型的参数

def func():
    print(func)

l = [1, 2, func, func()]  # 定义的时候默认执行了func(),所以下面先打印了 func
# func  # func函数没有返回值,所以默认是None
print(l)
# [1, 2, <function func at 0x0000013931C92E18>, None]

函数对象小练习

题目: # 循环打印项目功能提示信息 供用户选择 用户选择谁就执行谁 

技术图片
def register():
    username = input(username>>>:).strip()
    pwd = input(password>>>:).strip()
    print(username,pwd)
    print(register ...)
def login():
    print(login ...)
def transfer():
    print(transfer ...)
def shopping():
    print(shopping...)
def pay():
    print(pay ...)

msg = """
1 注册
2 登陆
3 转账
4 购物
5 支付
"""
func_dict = {
    1:register,
    2:login,
    3:transfer,
    4:shopping,
    5:pay,
}
while True:
    print(msg)
    choice = input(请现在你想要执行的功能>>>:).strip()
    if choice in func_dict:
        func_dict.get(choice)()  # 函数名()

    # if choice == ‘1‘:
    #     register()
    # elif choice == ‘2‘:
    #     login()
    # elif choice == ‘3‘:
    #     transfer()
    # elif choice == ‘4‘:
    #     shopping()
    # elif choice == ‘5‘:
    #     pay()
    else:
        print(你输入的功能暂时没有)
示例答案(可以把对应关系优化下)

函数的嵌套调用与定义

嵌套调用

函数的嵌套调用: # 在函数内部调用其他函数 

def index():
    print(index)

def func():
    index()  # 在定义 func 函数的时候不会直接调用 index 的方法 --> 函数定义的时候不执行代码
    print(func)

func()
# index  # 通过 func()函数内部调用了index() 函数,打印出了 index
# func

函数的嵌套调用可以 # 将复杂的逻辑简单化 

  小练习: # 写一个函数可以求四个数中的最大值 

技术图片
def my_max(x, y):
    if x > y:
        return x
    return y

def my_max4(a, b, c, d):
    res = my_max(a, b)
    res = my_max(res, c)
    res = my_max(res, d)
    return res

print(my_max4(1, 5, 7, 1))
# 7
案例代码

嵌套定义

def outer():
    x = 1
    print("outer")
    def inner():
        print("inner")
    inner()

# inner()  # 会报错,在外部无法访问内部内容
outer()
# outer
# inner

实现在外部调用 outer函数的内部函数 inner

技术图片
# 想在外部调用inner 可通过把内部的函数名当做外部函数的返回值来返回给外部
def outer():
    x = 1
    print("outer")
    def inner():
        print("inner")
    return inner  # 把 inner 函数当做函数的返回值返回给 outer函数的调用者

res = outer()
# outer
res()  # 变相调用inner
# inner
实现代码

技术图片

小案例: # 写一个函数,该函用户可以通过传参的不同 控制函数指向不同的功能 

技术图片
def all_func(type):
    def register():
        print(register)
    def login():
        print(login)
    def shopping():
        print(shopping)

    if type == 1:
        register()
    if type == 2:
        login()
    if type == 3:
        shopping()

all_func(1)
all_func(2)
all_func(3)
# register
# login
# shopping
实现代码

名称空间

 名称空间: # 存放的是变量名与变量值的内存地址绑定关系的地方 ,后文可能称之为命名空间。

 访问变量的值: # 要想访问一个变量的值,必须先去名称空间拿到对应的名字,才能访问变量的值 

命名空间的分类

 命名空间分为: # 内置名称空间、全局名称空间、局部名称空间 三大类

 内置命名空间

内置名称空间: # python 解释器提前已经定义好了的名字(已经存放到了内置名称空间中了) 

print("hello world")
max(1, 44, 62, 15)
len(26515f1asfafqw)
sum([1, 2, 3, 4, 5])
# 像上面的print max len sum 并没有定义就可以值使用,它们就是python解释器提前定义好了的函数,属于内置命名空间的

 全局命名空间

 全局命名空间: # 文件级别的代码 

x = 1
if x == 1:
    y = 2
print(y)
# 2

for i in [1, 2]:
    print(i)
print(i)
# 1
# 2
# 2

# 上面的 x y z 都在全局名称空间,不要以为缩进的就是局部的(if、 for、 while 无论嵌套,多少层,他们内部所创建的名字都是全局名称空间的)

 局部命名空间

 局部命名空间: # (目前所学)函数体内创建的名字都属于局部名称空间(函数名是属于全局名称空间的) 

def func():
    username = jason
# print(username)  # 会报错 NameError: name ‘username‘ is not defined
func()

  至于为什么上面的 print(username) 为什么会报错,学完下面的知识你就知道啦。

命名空间的生命周期

‘‘‘
名称空间的生命周期
    内置名称空间:(最长)只要 python解释器启动,立马创建  关闭 python解释器时自动销毁
    全局名称空间: 只要右键运行 py文件就会自动创建  py文件程序运行结束自动销毁
    局部名称空间:(动态创建动态销毁)函数被调用的时候自动创建  函数执行结束后立即销毁
‘‘‘

 

python函数

标签:margin   结束   efi   for   内部函数   一个   type   复杂   嵌套   

原文地址:https://www.cnblogs.com/suwanbin/p/11164596.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!