Python入门

内置 迭代函数 和 推导函数

# enumerate

s= 'abcdefg'
slist = [list([i,item]) for i,item in enumerate(s)]
print(slist)
[[0, 'a'], [1, 'b'], [2, 'c'], [3, 'd'], [4, 'e'], [5, 'f'], [6, 'g']]
# sorted

f = [5,58,2,75]
fsort = [i for i in sorted(f)]
print(fsort)
[2, 5, 58, 75]
#reversed

sreversed = [n for n in reversed(s)]
print(sreversed)
['g', 'f', 'e', 'd', 'c', 'b', 'a']
#zip 

s1 = ['name','age','addr']
s2 =['tom','33','UK']
szip = dict(zip(s1,s2)) 
szip_1 = {k:v for k,v in zip(s1,s2)}
print(szip)
print(szip_1)
{'name': 'tom', 'age': '33', 'addr': 'UK'}
{'name': 'tom', 'age': '33', 'addr': 'UK'}
s0 =[i*2 for i in range(10)]
print(s0)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

推导函数进阶

# 推导进阶

s0 = [i**3 for i in range(10) if i % 2 ==0]
print(s0)
[0, 8, 64, 216, 512]

数组,元组,字典,空字符串,非空字符串,0.非零的 True Or False

 flag = []
 if flag is not None:
     print('[] is not none')
 else:
    print('[] is none')
    
 if flag:
    print('[] is True')
else:
    print('[] is Flase')
[] is not none
[] is Flase
flag = ()
if flag  is not None:
    print('() is not none')
else:
    print('() is none')
    
if flag :
    print('() is True')
else:
    print('() is False')
() is not none
() is False
flag = {}
if flag  is not None:
    print(r'{} is not none')
else:
    print(r'{} is none')
    
if flag :
    print(r'{} is True')
else:
    print(r'{} is False')
{} is not none
{} is False
flag = ''
if flag  is not None:
    print(r' empty string is not none')
else:
    print(r' empty string is none')
    
if flag :
    print(r' empty string is True')
else:
    print(r' empty string is False')
 empty string is not none
 empty string is False
flag = 0
if flag  is not None:
    print(r'0 is not none')
else:
    print(r'0 is none')
    
if flag :
    print(r'0 is True')
else:
    print(r'0 is False')
0 is not none
0 is False
flag = 1
if flag  is not None:
    print(r'1 is not none')
else:
    print(r'1 is none')
    
if flag :
    print(r'1 is True')
else:
    print(r'1 is False')
1 is not none
1 is True
flag = "s"
if flag  is not None:
    print(r's is not none')
else:
    print(r's is none')
    
if flag :
    print(r's is True')
else:
    print(r's is False')
s is not none
s is True
flag = None
if flag  is not None:
    print(r'None is not none')
else:
    print(r'None is none')
    
if flag :
    print(r'None is True')
else:
    print(r'None is False')
None is none
None is False

字典的另类用法

def fn_A():
    print('fn_A called')
    
def fn_B():
    print('fn_B called')

def fn_C():
    print('fn_C called')
    
def fn_D():
    print('fn_D called')
    
dic_config = {}
dic_config["A"] = fn_A
dic_config["B"] = fn_B
dic_config["C"] = fn_C
dic_config["D"] = fn_D 
user_choose = 'A'
dic_config[user_choose]()
fn_A called

迭代器 生成器 装饰器

迭代器

任何一个类,如果实现了 __iter__()方法 和 __next__() 方法就是迭代器,或称作可迭代。

__iter__()

返回自身

__next__()

返回下一个元素

如果元素迭代完毕,则需要引发一个 StopIteration 异常

Python 内置了很多 迭代器都在 itertools 中。

import math

class Person:
    def __init__(self,**kwargs):
        self.Name = kwargs["name"]
        self.Age = kwargs["age"]
        
# 这个迭代器的意义在于,生成了 指定数量的 Person对象,并遍历了他们。如果需要生成100万个样本,用数组无疑会造成内存负担。
class MyIterator:
    def __init__(self,**kwargs):
        self.data = []
        self.max = kwargs["num"] if kwargs["num"] else 1
        for i in range(self.max):
            self.data.append(Person(name = "%s%d"%(kwargs["name"],i),age = 18 +i))
            self.currentIdx = -1 
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.currentIdx < self.max-1:
            self.currentIdx += 1
            return self.data[self.currentIdx]
        else:
            raise StopIteration
            
            
# 调用代码
for p in MyIterator(name ="name",age = 18,num = 10):
    print(p.Name,p.Age)
name0 18
name1 19
name2 20
name3 21
name4 22
name5 23
name6 24
name7 25
name8 26
name9 27

生成器

生成器有个关键函数 yield 用于生成序列。也是用一个生成一个。

def myYield(n):
    while n > 0:
        print('开始生成...')
        yield n
        print('完成生成...')
        n -=1

for i in myYield(3):
    print(i)
开始生成...
3
完成生成...
开始生成...
2
完成生成...
开始生成...
1
完成生成...

发现了一个规律,生成器返回之后,我们的调用程序继续运行,我们的调用程序运行之后。再次返回到生成器中。如此循环!

生成器有两个重要函数

\_\_next()\_\_ 生成下一个数

send(num) 重置生成器

如此一来,上面的例子可以写成。

yieldIteration = myYield(3)
print(yieldIteration.__next__())
print(yieldIteration.__next__())
print(yieldIteration.__next__())
print(yieldIteration.__next__())  # 这里报错了。错误是 StopIteration 我们就很好理解了。
开始生成...
3
完成生成...
开始生成...
2
完成生成...
开始生成...
1
完成生成...



---------------------------------------------------------------------------

StopIteration                             Traceback (most recent call last)

Input In [76], in <cell line: 5>()
      3 print(yieldIteration.__next__())
      4 print(yieldIteration.__next__())
----> 5 print(yieldIteration.__next__())


StopIteration: 

装饰器——基于方法的

读过设计模式的都知道,装饰器实际上是一种设计模式。python 里面也只是个语法糖。

我的理解是,将重复的操作,需要加到一些已有的函数中去,但又不想改变现有函数的结构和功能,此时可以使用装饰器解决这个问题。

到后面会发现,这玩意儿 跟 js 的闭包很像。


# 这是不带参数的 装饰器
def demo_decorater(fun):
    def new_func(*args,**kwargs):
        print('准备执行原生方法')
        fun(*args,**kwargs)
        print('原生方法执行完毕')
    return new_func

@demo_decorater
def fun_demo(name,age):
    print(f'我是 fun_demo 方法 {name}  {age}'.format(name,age) )
    
    
fun_demo('tom',23)

print("割----------------------------------------------")

# 这是带参数的装饰器
# 其中,装饰器有返回值,被装饰的方法也有返回值

def demo_decorater_with_args(url):
    def demo_wrapper(fun):
        def wrapper(*args,**kwargs): 
            fn_result = fun(*args,**kwargs) 
            return fn_result,f'url is: {url}'.format(url)
        return wrapper
    return demo_wrapper

@demo_decorater_with_args("http://www.baidu.com")
def func_demo(**args):
    name =args["name"]
    print(f"my name is  {name}".format(name)) 
    return 'do other thing'
    
s,f = func_demo(name = "tom")

print(s)
print(f)
准备执行原生方法
我是 fun_demo 方法 tom  23
原生方法执行完毕
割----------------------------------------------
my name is  tom
do other thing
url is: http://www.baidu.com

1、 被装饰的方法的返回值,可以在装饰器中获取。

2、 装饰器的返回值,可以在被装饰的方法调用后获取。

3、 在装饰器中,可以处理方法的返回值。重新定义返回值

装饰器——基于类的

在装饰器装饰方法的时候,一般是对方法功能的扩展,也可以修改其返回的信息。

在对类进行装饰的时候,我们可以扩展类的功能,添加方法,也可以修改原有方法的功能,还可以为这个类新增一些字段和属性。

'''
现有 Human 类

class Human:
    def __init__(self,name = "tom"):
        self.name = name
        
    def info(self):
        print('my name is ',self.name)
'''
        

# 现在有需求,在 Human类上 扩展 学生信息,但又不能影响现有 使用Human类的代码。

def Student(targetClass):
    class innerClass:
        
        def __init__(self,name):
            self.target = targetClass(name)
            # 扩展了新的 属性
            self.Grade = 1
        
        # 在原有的方法上加了新的功能
        def info(self):
            self.target.info()
            self.Study()
        
        # 添加了新的功能 study 
        def Study(self):
            print('I\'m a student,I can study')
            
    return innerClass    

# 定义一个类
@Student
class Human:
    def __init__(self,name):
        self.name = name
        
    def info(self):
        print('my name is ',self.name)

s = Human("tom")
s.info()
g = s.Grade
print(f'我上 {g} 年级'.format(g))
my name is  tom
I'm a student,I can study
我上 1 年级

可以看到,原来的Human 类的 构造函数是有 参数的,我们装饰器内部的类跟原有类用相同的构造函数。

posted @ 2022-05-26 17:41  莫问哥哥  阅读(103)  评论(0编辑  收藏  举报