进阶

形参角度

*args能接受所有位置参数

聚合成了一个元组

**能接受所有的关键字 无敌

聚合成了一个字典

*的魔性用法

当函数执行时:*iterable代表打散
*只打散最外层
**只应用于字典
函数外:处理剩余元素:
a,*c=range(5)
pritn(a,c) #0,[1,2,3,4]

处理元组的剩余元素,得到的还是列表格式的;
a,*c,b=(1,2,3,4,5,6)
print(a,b,c) #1 6 [2,3,4,5] 

形参角度的最终顺序

位置参数,*args,默认参数,仅限关键字参数,**kwargs

第四种传参方式

形参角度第四种传参方式:仅限关键字参数  (了解)
位置参数,*args,默认参数,仅限关键字参数,**kwargs
def func(a,b,*args,sex='man',c,**kwargs,):
    print(a)
    print(b)
    print(sex)
    print(c)
    print(args)
    print(kwargs)
func(1,2,4,5,6,67,c=666,name='太白',age=18,)

从空间角度研究函数

全局名称空间里面存储的是变量和值之间的关系

取值顺序加载顺序

import time
print(time.time())
print(111)
time.sleep(1)
age = 18

print(66)。
input()

变量(函数名也叫变量)


input = 666
print(input)
从全局寻找input ————> 全局名称空间 ——————> 内置

input = '太白'
def func(): 
    input = 666
    print(input)
func()

从局部寻找input —————> 局部名称空间 ———> 全局名称空间 —————> 内置
取值顺序:单向不可逆

内置函数:globals,locals

"""
此文件研究的是内置函数 globals locals
"""
name = 'alex'
l1 = [1, 2, 3]

def func():
    age = '18'

print(globals()) # 全局作用域所有的内容
print(locals())  # 当前位置


name = 'alex'
l1 = [1, 2, 3]

def func():
    age = '18'
    oldboy = '老男孩教育'
    print(globals()) # 全局作用域所有的内容
    print(locals())  # 当前位置的变量与值的对应关系

func()

name = 'alex'
l1 = [1, 2, 3]

def func():
    age = '18'
    oldboy = '老男孩教育'
    def inner():
        name_class = 'python23期'
        print(globals()) # 全局作用域所有的内容
        print(locals())  # 当前位置的变量与值的对应关系
    inner()
func()

高阶函数

例1:

def func1():
    print('in func1')
    print(3)

def func2():
    print('in func2')
    print(4)
func1()
print(1)
func2()
print(2)
'''
in func1
3
1
in func2'
4
2
'''

例2:
def func1():
    print('in func1')
    print(3)

def func2():
    print('in func2')
    func1()
    print(4)

print(1)
func2()
print(2)
'''
1
in func2
in func1
3
4
2
'''
def fun2():
    print(2)
    def func3():
        print(6)
    print(4)
    func3()
    print(8)

print(3)
fun2()
print(5)
'''
3 2 4 6 8 5
'''

关键字:global,nonlocal

global:(剪切)

  1. 可以在局部作用域声明一个全局变量
def func():
    global name
    name = 1
    print(globals())
    print(locals())
    name += 1
    print(globals())
func()
print(name)
print(globals())
  1. 可以修改全局变量

    count=0
    def func():
        global count
        count+=1
        
    print(count)
    func()
    print(count)
    

nonlocal:(复制)

  1. 不能操作全局变量
  2. 可以对父级作用域的变量进行修改(父级复制来自子级的变量)

默认参数的坑

# 当你的默认参数如果是可变的数据类型,你要小心了。
def func(a,l=[])
    l.append(a)
    return l
func(1)
func(2)
func(3)

[1]
[1, 2]
[1, 2, 3]

函数名的应用

函数名是一个特殊的变量,
1.函数名是一个特殊的内存地址,加上括号就能运行
def func():
    print(666)
print(func)
<function func at 0x0000020A394A60D0>

2.函数名是一个变量
def func1():
    print(6666)
ret=func1
ret()
6666
3.函数名可以作为容器类类型的元素
def func1():
    print("in func1")
def func2():
    print("in func2")
def func3():
    print("in func3")
func1()
func2()
func3()
l=[func1,func2,func3]
for i in l:
    i()
in func1
in func2
in func3
in func1
in func2
in func3
4.函数名可以作为函数的实参传进去
def func1():
    print(666)
def func2(a):
    print(a)
    a()
    print(6666)
func2(func1)
<function func1 at 0x000001CD822360D0>
666
6666

5.函数名可以作为函数的返回值
b=666
def func1():
    print("in func1")
def func2(a):
    print("in flunc2")
    return func1()
ret=func2(b)

in flunc2
in func1

def func1():
    print("in func1")
def func2(a):
    print("in flunc2")
    return a
ret=func2(func1)
ret()

in flunc2
in func1

python新特性:f-string

f一般不区分大小写
可以加入表达式
s1="alex"
s2=f"我的名字{s1.upper()}"
print(s2)

可迭代对象

可迭代对象

字面意思分析:可以重复的迭代的实实在在的东西。

list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定)

专业角度: 内部含有'__iter__'方法的对象,就是可迭代对象。

内置函数:dir() print(dir(str))

判断一个对象是否是可迭代对象: print('iter' in dir(str))

优点:

直观。

操作方法较多。

缺点:

占内存

不能迭代取值(索引,字典的key)

迭代器

字面意思:可以重复迭代的工具。

专业角度: 内部含有'__iter__'并且含有"__next__"方法的对象,就是迭代器

可迭代对象转化成迭代器:
l1 = [1, 2, 3, 4, 5]
# 内置函数iter()
obj = iter(l1)

li=[1,2,3,4,5]
obj=iter(li)
print(obj)
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))

迭代器优点:
1.非常节省内存。
2.惰性机制。
迭代器缺点:
1.不直观。
2.操作不灵活。
3.效率相对低。

可迭代对象与迭代器的对比

可迭代对象:可迭代对象是一个操作比较灵活,直观,效率相对高,但是比较占用内存的数据集。

迭代器:迭代器是一个非常节省内存,满足惰性机制,但是效率相对低,操作不灵活的数据集。
posted @ 2019-06-19 16:02  吃大碗宽面·  阅读(84)  评论(0编辑  收藏  举报