python 笔记

map-lambda

map 印象最深的是在数据分析时,利用字典(key是日期)从DataFrame的具体日期列映射出所属月份列和所属的周列,简洁高效。

想强行用lambda抽象一大段包含判断的代码
刚开始直接加上判断,报错

map(lambda x : os.mkdir(x) if not (os.path.lexists(x) else pass , a)

前辈说应该判断要给返回值,仔细一看差点被自己蠢死,把pass成None就可以了。

map(lambda x :os.mkdir(x) if not (os.path.lexists(x) else None,a)

————————————————

call

使得类可以像函数一样被调用。(类似重载圆括号?)

————————————————

@Decorator

在代码运行期间动态增加功能的方式,称之为装饰器(Decorator)。

————————————————

*args **kwargs

*args 表示任何多个无名参数,是tuple
**kwargs 表示关键字参数,是字典

————————————————

编码(keng)

print 可以把常见类型的对象打印成一串文字。
str repr

str 把对象转化成字符串的形式
得到的字符串可读性好,适合print

repr (obj) 告诉我们obj在后台是什么样子的,怎么被python玩弄的。
得到的字符串通常可以重新获得该对象;representation(内建函数eval()【动态执行字符串】【为了动态产生代码】)
————————————————
————————————————

类变量和实例变量 以及self的理解

类变量定义在类中且在函数体之外,

实例变量定义在方法中,用 self 绑定,只作用于当前实例的类。在类的内部,实例变量用self.实例变量 访问;在类的外部,实例变量用 实例名.实例变量 的形式访问。

类方法与普通方法区别在 它必须有一个额外的第一个参数名称 self (建议使用),调用时不用对它赋值,它指代对象本身(实例),而不是类。 self 总是指代调用时类的实例。
————————————————————————————
————————————————————————————
————————————————————————————
————————————————————————————
partition
类似find()和split()的结合体;

string.partition(str)
返回一个3个元素的元组 (string_before_str,str,string_after_str)

————————————————————————————
itertools (实现排列组合的模块)
排列 a中选b个排列

itertools.permutations([a],b)

组合 a中选b个组合

itertools.combinations([a],b)

————————————————————————————

bisect

bisect.bisect_left(list,x) #在list中查找x,x存在时返回x左侧位置,不存在时返回应该插入的位置
bisect.bisect_right(list,x) #同上(右侧)
bisect.insort_left(list,x) #将x插入列表中,x存在时在左侧
bisect.insort_right(list,x) #同上(右侧)

—————————————————————————————
deque

from collections import deque
deque(maxlen= ) 用于创建一个固定长度的队列,当有新纪录而队列已满时自动移除最老的那条记录;
deque() 创建一个无界限的队列,可在两端添加和弹出;复杂度都为O(1),而列表的头部插入和移除 复杂度为O(N)
—————————————————————————————

分解操作

只要对象是可迭代的(元组,列表,字符串,文件,迭代器,生成器),那么就可以执行分解操作。

p = (45)
x,y = p
x  #4
y  #5

用 *表达式,返回列表

————————————

找到最大或最小的N个元素

heapq模块中的 nlargest() 和 nsmallest()

nlargest(3,list) #找出list中最大的3个数

可接受参数key,从而允许它们工作在更复杂的数据结构上。

    portfolio = [
    {'name' = 'IBM','shares':100,'prices':91.1},
    {'name' = 'AAPL','shares':50,'prices':543}
    ]
    cheap = heap.nsmallest(3,portfolio,key=lambda s:s['price'])

当要找的最大/小 的N个元素的个数和集合元素中总数目相比,N很小时,用heapq.heapify更高效(复杂度是O(logn))

nums=[ …. ]
heap = list(nums)
heapq.heapify(heap) #以堆得顺序排列,最重要的特性是heap[0]总是最小的那个元素

————————————————————

优先级队列

实现一个队列,它能够以给定的优先级对元素排序;
heap 是一个最小堆(父节点小于等于子节点),堆顶元素a[0]永远是最小的,和java的优先队列类似。
heapq.heappush(self._queue,(-priority,self._index,item))

cookbook 介绍的heappush用法在文档上只找到heappush(heap,x)。大概理解为将item包含在元组中,先按设定的priority排序,优先级相同时按元素入队列的index排序。利用了python判断元组大小的机制,从索引为0的成员开始逐个比较。

————————————————————

字典
字典映射到多个值上

① 直接将值保存到列表或集合中

d = { ‘a’:[1,2,3],’b’:[4,5] }
e = { ‘a’:{1,2,3},’b’:{4,5} }

②用collections模块的defaultdict类

from collections import defaultdict
d = defaultdict(list)
d['a'].append(1)

~~~~~~~~~~~~~~~~~~~~~~~~

字典相关的计算

zip 内建函数(与序列有关的内建函数有:sorted(),reversed(),enumerate(),zip() )
zip 接受一系列可迭代对象作为参数,将对象中相应索引的元素打包成一个个tuple,然后返回包含这些tuple的list。(若传入对象长度不一,返回list长度为传入对象中最短的)
zip 将zip过的对象解压;可以实现矩阵行列转换。

-最值-
zip(dict.values(),dict.keys() ) 可形成字典的kv(元组)列表,用min/max可找出最值;用sorted可对数据排序。(zip()创建了一个迭代器,内容只能被消费一次

【【可哈希对象 如果一个对象在自己生命周期中有一哈希值是不可变的,那么它就是可哈希的;python中所有不可改变的对象都是可哈希的,如String,tuple;而可改变的容器如dict,列表,集合不可哈希。 可哈希对象判断相等的唯一条件是两者的哈希值相等。】】

~~~~~~~~~~~~~~~~~~~~~~~~

通过公共键对字典列表排序
from operator import itemgetter
sorted(rows,key=itemgetter('a','b'))

sorted()接受关键字参数key,代表一个callable对象,接受rows中的元素作为排序的依据值。

~~~~~~~~~~~~~~~~~~~~~~~~

序列中出现次数最多的元素
from collections import Counter
    a = Counter(list)
    b = a.most_common(N)

找出出现次数前N的元素

Counter的底层实现是字典,在元素和它们出现的次数间做了映射。
Counter对象可以结合数学运算操作使用

~~~~~~~~~~~~~~~~~~~~~~~~

同一个类的实例间作排序

在类中加入用于排序的id属性

class User:
    def __init__(self,user_id):
        self.user_id = user_id
    def __repr__(self):
        return 'User({})'.format(self.user_id)

sorted(users,key=lambda u:u.user_id)
#lambda表达式也可以用attrgetter('user_id)代替;相较于lambda,attrgetter可以同时提取多个字段,就可以根据多个值进行排序。

format

{ }.format

sorted

sorted(iterable[,cmp[,key[,reverse]]])
reverse 是一个bool变量,默认False(升序排列)

operator.attrgetter & operator.itemgetter

b = operator.itemgetter(1) #定义函数b,获取对象的第1个域的值
b(a) #函数b作用在a上

按索引 f = itemgetter(2)  #f(r) 返回 r[2]
按键值 f = attrgetter('name') #f(b) 返回 b.name

operator.itemgetter函数是先定义一个函数,然后通过该函数作用到对象上才能获取值。

~~~~~~~~~~~~~~~~~~~~~~~~

筛选序列中的元素

通常的方法是列表推导式

[n for n in LIST if n > 0]
但是是如果原始输入非常大时,这么做可能产生一个非常庞大的结果;针对这个问题,可以用生成器表达式通过迭代的方式产生筛选的结果。
(n for n in LIST if n > 0]
筛选过程涉及异常处理或复杂的细节,可以将筛选逻辑代码放到单独的函数,然后用 filter() 函数处理。

~~~~~~~~~~~~~~~~~~~~~~~~

any & all

any() doc: Return True if any element of the iterable is true. If the iterable is empty, return False.
all() doc: Return True if any element of the iterable is true. If the iterable is empty, return False.
~~~~~~~~~~~~~~~~~~~~~~~~

映射名称到序列元素
#通过下标访问列表或元组会使得代码难以阅读?这时可以用到这个方案。
但是数据规模大会使命名元组使用不便?

————————————————————

Tkinter(gui) & socket & threading

学习做一个简单的聊天程序;tcp协议,gui,多线程都涉及到了一些。记录一下学习小结。

~~~~~~~~~~~~~~~~~~~~~~~~
socket模块基本的模式:

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)   # build connection (ipv4,tcp)
s.bind((host,port))   # bind socket and local ip&port
s.listen(5)
while True:
    sock,addr = s.accept()
    t = threading.Thread(target=,args=)  #response to clients with fork meanwhile the parent process runs unimpeded


————————————————————

slots

python中任何类的实例对象包含一个字典
*__dict__ ,python通过这个字典给对象绑定属性。

而*__slots__中定义的变量变成了类的描述符,类似于java中的成员变量声明;类中的实例只能拥有这些变量,不再有dict,也不能再增加新变量。–应用场景 > 想使用固定对象,而不想任意绑定对象。
————————————————————

yield

带有yield的函数,python解释器将其视为一个generator,调用时代码不会运行,直到遇到next()。
~~~~~~~~~~~~~~~~~~~~~~~~
反向迭代:
可以在自定义类实现反向迭代。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值