Python_杂学系列_3.python进阶

前言

这一部分是关python进阶,其实没什么,就是把别人家的敲了一遍,然后汇总了,怕以后会用的到(记忆力不太好)

一、参考资料

Python进阶


二、不定参数*args 和 **kwargs

  • *args 是用来发送一个非键值对的可变数量的参数列表或元组给一个函数
  • **kwargs 允许你将不定长度的键值对, 作为参数传递给一个函数
def test(a, *arg):
    print(a)
    for arg in arg:
        print("*arg的参数:", arg)
test('a', 'b', 'c', 'd')

def test1(**kwargs):
    for key, value in kwargs.items():
        print("{0} == {1}".format(key, value))
test1(a=1,b=2,c=3)

def test3(f, *arg, **kwargs):
    print(f)
    for arg in arg:
        print("*arg的参数:", arg)
    for key, value in kwargs.items():
        print("{0} == {1}".format(key, value))
test3(1, 'b', 'c', 'd', a=1, b=2, c=3)

#使用 *args 和 **kwargs 来调用函数
def test4(a, b, c):
    print("第一个值:", a)
    print("第二个值:", b)
    print("第三个值:", c)
arg=[1,2,3]
kwarg={"b":2,"a":1,"c":3}#key为函数参数test3(a, b, c)
test4(*arg)
test4(**kwarg)

三、生成器(Generators)

  1. 可迭代对象(Iterable)
    Python中任意的对象,只要它定义了可以返回一个迭代器的__iter__方法,或定义了可以支持下标索引的__getitem__方法,那么它就是一个可迭代对象。
    简单说,可迭代对象就是能提供迭代器的任意对象
  2. 迭代器(Iterator)
    迭代器是一个让程序员可以遍历一个容器(特别是列表)的对象。任意对象,只要定义了next(Python2) 或者__next__方法,它就是一个迭代器。
  3. 迭代(Iteration)
    它就是从某个地方(比如一个列表)取出一个元素的过程。
  4. 生成器(Generators)
    生成器也是一种迭代器,但是你只能对其迭代一次。

5. next()
它允许我们获取一个序列的下一个元素。
6. iter()
它将根据一个可迭代对象返回一个迭代器对象

def test5():
    for i in range(10):
        yield i
#第一种方式
gen=test5()
print(next(gen))
print(next(gen))
print(next(gen))
for i in test5():#第二种方式
    print(f'这是迭代{i}')

#一个计算斐波那契数列的生成器:
def fibon(n):
    a = b = 1
    for i in range(n):
        yield a
        a, b = b, a + b
for x in fibon(100):
    print(x)
#普通方式更耗资源
# def fibon(n):
#     a = b = 1
#     result = []
#     for i in range(n):
#         result.append(a)
#         a, b = b, a + b
#     return result

#iter()应用
a1=[1,2,-4,5,6,7]
a=iter(a1)
print(next(a))
print(next(a))

a=iter(range(10))
print(next(a))
print(next(a))
print(next(a))

该处使用的url网络请求的数据。

四,Map,Filter 和 Reduce

  • Map会将一个函数映射到一个输入列表的所有元素上。
  • filter过滤列表中的元素,并且返回一个由所有符合要求的元素所构成的列表.
  • Reduce当需要对一个列表进行一些计算并返回结果,例子,当你需要计算一个整数列表的和时。
#Map例子1
#items = [1, 2, 3, 4, 5]
#squared = []
#for i in items:
#    squared.append(i**2)
items = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, items))

#Map例子2
def add(x,y):
    return x+y
def decrease(x,y):
    return x-y
func=[add,decrease]
for i in range(5):
    value=list(map(lambda x:x(i+3,i+2),func))
    print(value)

#Filter例子1
a=[1,2,3,-1,-2,-3,-4]
bb=filter(lambda x:x>0,a)
print(list(bb))

#Reduce 例子1
from functools import reduce
a=reduce(lambda x,y:x+y,[1,2,3,4])
print(a)

五,set(集合)数据结构

  • set不能包含重复的值。(最大特征)
#查看重复值
list1 = ['a', 'b', 'c', 'b', 'd', 'm', 'n', 'n']
test = set([x for x in list1 if list1.count(x) > 1])
print(test)
#交集差集
list1 = ['a', 'b', 'c', 'e', 'f']
list2 = ['a', 'b', 'c', 'g']
print(set(list2).intersection(set(list1)))
print(set(list2).difference(set(list1)))
#set1 = {'red', 'blue', 'green'}#创建

六,装饰器

增加函数的功能的函数,有助于让我们的代码更简洁。

a1=[1,2,-4,5,6,7]
for x in a1:
    if x > 0: a1.remove(x)
print(a1)

a1=[1,2,-4,5,6,7]
for x in a1[:]:
    if x > 0: a1.remove(x)
print(a1)

七,列表,字典,集合推导式

用起来,特别爽!通常和lambda表达式联用

  • 列表(list)推导式
  • 字典(dict)推导式
  • 集合(set)推导式
#列表(list)推导式
#variable = [out_exp for out_exp in input_list if out_exp == 2]
test= [i for i in range(30) if i % 3 is 0]
print(test)
squared = [x**2 for x in range(10)]
#字典(dict)推导式
my_dict = {'a': 'av', 'b': 'bv', 'c': 'cv'}
test={v: k for k, v in my_dict.items()}
print(test)
#集合(set)推导式
squared = {x**2 for x in [1, 1, 2]}
print(squared)

八,异常

#处理多个异常
try:
    file = open('test.txt', 'rb')
except EOFError as e:
    print("An EOF error occurred.")
    raise e
except IOError as e:
    print("An error occurred.")
    raise e
#捕获所有异常
try:
    file = open('test.txt', 'rb')
except Exception:
    # 打印一些异常日志,如果你想要的话
    print('exception')
else:
    # 这里的代码正常时运行, 但是这里的异常将不会 被捕获
    print('正常时打印.')
finally:
    print("总会打印")

九,lambda表达式

lambda表达式是一行函数。被称为匿名函数

#相加
add = lambda x, y: x + y
print(add(3, 5))

#列表排序
a=[(1,2),(3,4),(2,1)]
a.sort(key=lambda x:x[1],reverse=True)
print(a)

十,内置函数

  1. zip()
  2. round()
  3. dir()
#zip()
list1 = [1, 2, 3, 4]
list2 = [1, 2, 3, 4]
data = zip(list1,list2)
print(list(data))
#round()
print(round(1.2242,2))

十一,特殊技巧

  • 列表的碾平
  • 构造器
    避免类初始化时大量重复的赋值语句
    -For - Else
  • 上下文管理器
  • Hash
  • 注释
  • 深拷贝和浅拷贝
    深拷贝指的是复制内容,单独开辟一个内存,浅拷贝指的是两个变量同时指向一个内存ID;
    当拷贝内容是可变类型时,那么就会进行深拷贝,如果是不可变类型时,那么就会进行浅拷贝。
  • GET和SET,@property装饰器
#列表的碾平
import itertools
a=([1,2],[3,4],[5,6])
b=itertools.chain.from_iterable(a)
print(list(b))
# c=itertools.chain(*a)#第二种方式
# print(list(c))

#避免类初始化时大量重复的赋值语句
class A(object):
    def __init__(self, a, b, c, d, e, f):
        self.__dict__.update({k: v for k, v in locals().items() if k != 'self'})

    def printA(self):
        print(self.a,self.b,self.c,self.d,self.e,self.f)

A(1,2,3,4,5,6).printA()

#For - Else
for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print( n, '=', x, '*', n/x)
            break
    else:
        print(n, '是质数')

#上下文管理器
with open('some_file', 'w') as opened_file:
    opened_file.write('Hola!')

#hash
a='11'
print(hash(a))
# aa={1,2,'we',[1,2,3]}#TypeError: unhashable type: 'list'

#注释
def Text(a:3,b:int=5)-> "我是注释":
    print(Text.__annotations__)
    print(Text.__annotations__['return'])
    print(a,b)
    print(Text.__name__)
    print(Text.__str__)
# Text(1,2)
Text(1)

#深拷贝和浅拷贝
import copy
list1 = [1,2,3,4,5]
list2 = list1   #浅拷贝
list3 = copy.deepcopy(list1) #深拷贝
list4 =list1[:] #深拷贝。


#普通的get,set
class Test:
    def __init__(self, name):
        self.__name = name  # 私有属性
    def get_name(self):
        return self.__name
    def set_name(self, name):
        self.__name = name
t = Test('lzl')
print(t.get_name())
t.set_name('zhouyi')
print(t.get_name())

#@property装饰器
class Test:
    def __init__(self, name):
        self.__name = name  # 私有属性
    @property
    def name1(self):
        return self.__name

    @name1.setter
    def set_name1(self, name):
        self.__name = name
t = Test('lzl')
print(t.name1)
t.set_name1 = 'zhouyi'
print(t.name1)





十二,魔术方法

1.__call__#类比于函数的行为,
2.__str__#字符串显示
3.__repr__#如果找不到__str__()就会找__repr__()方法
4.__new__#实例化
5.__del__#当一个对象在内存中被销毁的时候自动执行
#__call__
class Person(object):
    def __call__(self, *args, **kwargs):
        print('call...')
person = Person()  # 将Person()的内存地址赋值给person
person(1 ,2 ,3 ,45)  # 内存地址()

#__str__,__repr__
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        msg = 'name:%s,age:%s' % (self.name, self.age)
        return msg
    # 如果没有__str__的时候,就会执行__repr__方法
    # 如果有就不执行__repr__方法。
    def __repr__(self):
        msg = f'name----》{self.name},age----》{self.age}'
        return msg
person = Person('lzl', 21)
print(str(person))
print(repr(person))

#__new__
class Person(object):  
    def __init__(self):# 初始化
        print('init...')
    # 实例化方法(构造方法)---》创建对象
    def __new__(cls, *args, **kwargs):
        print('new...')
        ret = super().__new__(cls) # 调用父类的__new__()方法创建对象,并用接收返回值
        return ret # 将对象返回给person
person = Person()
print(person)

十三,tuple的操作

1,
xxx=('/cae/html/main/colys/63775817.html', '曹喜滨')
x,y=xxx
print(x)

2,
xxx=('/cae/html/main/colys/63775817.html', '曹喜滨')
print(xxx[0])

十四,Bug求救

a1=[1,2,-4,5,6,7]
for x in a1:
    if x > 0: a1.remove(x)
print(a1)

a1=[1,2,-4,5,6,7]
for x in a1[:]:
    if x > 0: a1.remove(x)
print(a1)

总结

还需要好好钻研!!

posted @ 2022-01-08 15:43  cactus9  阅读(19)  评论(0编辑  收藏  举报