首页
关于
Search
1
怎么快速从GitHub上下载代码
48 阅读
2
GitHub下载加速的有效方法
39 阅读
3
Python中的center()是怎么用的
35 阅读
4
如何在GitHub上下载旧版本
34 阅读
5
怎样删除GitHub存储库
32 阅读
Python
Github
IDC推荐
登录
Search
Xbe
累计撰写
242
篇文章
累计收到
1
条评论
首页
栏目
Python
Github
IDC推荐
页面
关于
搜索到
81
篇与
的结果
2025-03-01
Python中UserDict、UserString、UserList有用吗?
一个继承Python内建结构的坑儿。从Python 2.2开始,Python支持继承Python内建结构,如list、dict。为了简化项目内容,直接继承了dict,但是结果和预期不一样。现在来好好研究研究:举个例子:In : class NewDict(dict): ...: def __getitem__(self, key): ...: return 42 ...: In : d = NewDict(a=1) In : d Out: {'a': 42} In : d2 = {} In : d2.update(d) In : d2 Out: {'a': 1}也就是说NewDict的__getitem__方法被dict.update给忽略了。In : from UserDict import UserDict In : class NewDict(UserDict): ...: def __getitem__(self, key): ...: return 42 ...: In : d = NewDict(a=1) In : d['b'] =2 In : d Out: {'a': 1, 'b': 2} In : d['b'] Out: 42 In : d2 = {} In : d2.update(d) In : d2 Out: {'a': 42, 'b': 42}这才是对的呀。后来在PyPy的文档中发现了原因,也就是这种C实现的结构的内建方法大部分会忽略重载的那个方法。之前以为UserDict这样的类是历史遗留问题,现在才知道是有原因的。原来UserDict、UserString、UserList这样的模块是非常必要的。
2025年03月01日
15 阅读
0 评论
0 点赞
2025-03-01
python几个
在Python中有许多以__开头的变量,这些变量是什么意思呢?这里介绍下[__dir__, __slots__, __weakref__,__missing__, __contains__]__dir__ -> 看个小例子就知道了In [1]: class T(object): ...: pass ...: In [2]: t = T() In [3]: t.<Tab>啥也没有...In [4]: class T2(object): ...: def __dir__(self): ...: return ['a', 'b'] ...: In [5]: t = T2() In [6]: t. t.a t.b In [7]: dir(t) Out[7]: ['a', 'b']看出来了把, 不解释, 但是这个__dir__是相对于类的实例有效果的.__slots__这个在我初学python的时候就被模糊了, 原来的理解是它的出现替代了__dict__,也就是说你只能给__slots__ 这个变量列表项的属性赋值. 对外的接口减少了,也安全了. 后来看了这篇Saving 9 GB of RAM with Python’s slots. 好久不做运维了,在生产环境究竟怎么样我无法定论, 也提到了,在对象实例很多的时候他能帮助减少内存, 详见https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch08s04.html. 这里来个小实验(在Hacker News也被讨论过https://news.ycombinator.com/item?id=6750187)代码例子(我对细节做注释):# coding=utf-8 import sys from itertools import starmap, product class SlotTest(object): # __slots__ = ['x', 'y', 'z'] 主要对比去掉这句和包含这句程序内存占用 def __init__(self, x, y, z): self.x = x self.y = y self.z = z def __str__(self): return "{} {} {}".format(self.x, self.y, self.z) p = product(range(10000), range(20), [4]) # 创建0-1000 & 0-20 & 4 的笛卡尔积 a = list(starmap(SlotTest, p)) # 相当于对每个SlotTest实例化,实例化的格式是p的长度 print a[0] sys.stdin.read(1)结果对比:$pmap -x `ps -ef|grep test_slot.py|grep -v grep|awk '{print $2}'`|grep total # 未使用__slots__ total kB 103496 76480 73728 $pmap -x `ps -ef|grep test_slot.py|grep -v grep|awk '{print $2}'`|grep total # 使用了__slots__ total kB 49960 22888 20136结果很明显,内存占用减少了很多...__weakref__ 弱引用首先先说下weakref: 弱引用,与强引用相对,是指不能确保其引用的对象不会被垃圾回收器回收的引用。一个对象若只被弱引用所引用,则被认为是不可访问(或弱可访问)的,并因此可能在任何时刻被回收. 在Python中,当一个对象的引用数目为0的时候,才会被从内存中回收. 但是被循环引用呢?In [1]: import weakref In [2]: import gc In [3]: class Obj(object): ...: def a(self): ...: return 1 ...: In [4]: obj = Obj() In [5]: s = obj In [6]: gc.collect() # 不可达引用对象的数量 Out[6]: 3 In [7]: print s is obj True In [8]: obj = 1 # 最初的被引用的对象改变了. In [9]: gc.collect() Out[9]: 0 In [10]: s is None # s还是指向了Obj 引用计数为1 Out[10]: False In [11]: s Out[11]: <__main__.Obj at 0x2b36510> ----华丽的分割一下 In [12]: obj = Obj() In [13]: r = weakref.ref(obj) # 让obj变成那个弱引用 In [14]: gc.collect() Out[14]: 211 In [15]: r() is obj True In [16]: obj = 1 In [17]: gc.collect() Out[17]: 0 In [18]: r() is None # 弱引用计数器没有增加,所以当obj不在引用Obj的时候,Obj对象就被释放了 Out[18]: True好吧, 我的总结是弱引用是个好东西, 但是加了__slots__就不支持弱引用了. 所以需要__weakref__In [9]: class T3(object): ...: __slots__ = [] ...: In [10]: class T4(object): ....: __slots__ = '__weakref__' # 这样就支持了weakref ....: In [11]: import weakref In [12]: t3 = T3() In [13]: t4 = T4() In [14]: weakref.ref(t3) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-14-bdb7ab7ac3bc> in <module>() ----> 1 weakref.ref(t3) TypeError: cannot create weak reference to 'T3' object In [15]: weakref.ref(t4) Out[15]: <weakref at 0x2766f70; to 'T4' at 0x2586fd8>__contains__ 判断某值 in/not in 实例In [1]: class NewList(object): ...: def __init(self, values): ...: self.values = values ...: def __contains__(self, value): ...: return value in self.values ...: In [2]: l = NewList([1, 2, 3, 4]) In [3]: 4 in l Out[3]: True In [4]: 10 in l Out[4]: False __missing__最初看这个特殊方法是看python标准库的源码的时候(collections#L421):class Counter(dict): ... def __missing__(self, key): 'The count of elements not in the Counter is zero.' # Needed so that self[missing_item] does not raise KeyError return 0什么意思呢?In [6]: c = collections.Counter({'a':1}) In [7]: c['b'] # 没有键的count设置默认值0 Out[7]: 0
2025年03月01日
7 阅读
0 评论
0 点赞
2025-03-01
python中的列表是什么
示例列表是元素的集合,存储在一个变量中。列表中存储的元素类型没有限制,下面是列表的一个简单例子。students = ['bernice', 'arron', 'cody']for student in students: print("Hello, " + student.title() + "!")命名和定义列表因为列表是对象的集合,所以给它们一个复数的名称是很好的做法。如果列表中的每一项都是一个 car, 就命名列表为 'cars'。这样给你了一种直接的方式代表列表('cars'),(’dog‘)指代列表项。在 Python 中,用中括号定义一个列表。如下所示:dogs = ['border collie', 'australian cattle dog', 'labrador retriever']访问列表元素列表中的元素通过位置来标识,从零开始。访问列表中的第一个元素,如下所示:dogs = ['border collie', 'australian cattle dog', 'labrador retriever']dog = dogs[0] print(dog.title())括号中的数字为列表的索引(index)。因为列表索引从0开始,列表元素的索引总是比它的位置小。因此 Python 被称为 zero-indexed 语言(诸如 C, Java)。因此访问第二个元素,我们需要用索引1,以此类推。dog = dogs[1] print(dog.title())访问列表中最后一个元素访问列表中的最后一个元素,可以用索引 -1。dog = dogs[-1] print(dog.title())访问倒数第二个,倒数第三个也可以用这种语法。dog = dogs[-2] print(dog.title())但是你不能用一个绝对值大于列表长度的负数访问。dog = dogs[-4] print(dog.title()
2025年03月01日
8 阅读
0 评论
0 点赞
2025-03-01
python列表推导式是什么?
乍一看到列表推导式你可能会感到疑惑。它们是一种创建和使用列表的简洁方式。理解列表推导式是有用的,因为你可能在其他人的代码里看到列表推导式。下面来了解下列表推导式吧。数字列表的推导式回顾之前学过的知识,我们可以创建一个包含前10个数字的列表,如下所示:squares = [] for number in range(1,11): new_square = number**2 squares.append(new_square) for square in squares: print(square)上述代码中我们实现了创建包含10个数字的列表,对每个数字作平方操作并将它们存储进新的数组的功能。代码略显冗长,我们可以省略 for 循环中的 new_square 参数,简化代码。使用列表推导式就可以进一步简化代码,如下所示:squares = [number**2 for number in range(1,11)] for square in squares: print(square)平方操作和生成新列表的过程都浓缩进了一行代码。你是不是已经晕头转向了,让我们来看看这行代码发生了什么。首先我们定义了一个列表,名字为 squares 。接下来看看列表中括号中的代码:for number in range(1, 11)它在1-10之间创建一个循环,把每个数字存储到变量 number 中。接下来我们看一看对每次循环中的 number 作了哪些操作。 number**2每个 number 都作了平方操作,并将结果存储在了定义好的队列中。我们可以用如下语言来阅读这行代码:squares = [raise number to the second power, for each number in the range 1-10]、其他例子上个例子是对数字作平方操作,下列代码是对数字作乘操作,仔细阅读代码,体会数字列表表达式的用法。# Make an empty list that will hold the even numbers. evens = []# Loop through the numbers 1-10, double each one, and add it to our list. for number in range(1,11): evens.append(number*2) # Show that our list is correct: for even in evens: print(even)非数字列表的推导式我们也可以在非数字列表中运用推导式。在下面的例子中,我们会创建一个非数字列表,然后利用推导式生成一个新的列表。不运用推导式的源代码如下所示:# Consider some students. students = ['bernice', 'aaron', 'cody']# Let's turn them into great students. great_students = [] for student in students: great_students.append(student.title() + " the great!")# Let's greet each great student. for great_student in great_students: print("Hello, " + great_student)我们想写下如下所示的推导式:great_students = [add 'the great' to each student, for each student in the list of students]代码如下所示:# Consider some students. students = ['bernice', 'aaron', 'cody']# Let's turn them into great students. great_students = [student.title() + " the great!" for student in students]# Let's greet each great student. for great_student in great_students: print("Hello, " + great_student)
2025年03月01日
4 阅读
0 评论
0 点赞
2025-03-01
使用Python实现一个堆栈结构
什么是堆栈?堆栈是一个数据结构,其存储在一个后进/先出的方式的项目。这通常被称为LIFO。这与队列形成对比,队列以先入/先出(FIFO)方式存储项目。使用list创建一个Python堆栈list您可能经常在程序中使用的内置结构可用作堆栈。相反的.push(),你可以使用.append()新的元素添加到您的堆栈的顶部,同时.pop()除去了LIFO顺序的元素:>>> myStack = [] >>> myStack.append('a') >>> myStack.append('b') >>> myStack.append('c') >>> myStack ['a', 'b', 'c'] >>> myStack.pop() 'c' >>> myStack.pop() 'b' >>> myStack.pop() 'a' >>> myStack.pop() Traceback (most recent call last): File "<console>", line 1, in <module> IndexError: pop from empty list你可以在最后的命令中看到,如果你调用空堆栈,list它将引发一个。IndexError.pop()list有熟悉的优点。你知道它是如何工作的,并且可能已经在你的程序中使用它了。不幸的是,list与其他数据结构相比,您会看到一些缺点。问题是随着它的发展,它会遇到速度问题。list存储a 中的项目的目的是提供对中的随机元素的快速访问list。在较高级别,这意味着项目在内存中彼此相邻存储。如果你的堆栈比当前拥有它的内存块大,那么Python需要做一些内存分配。这可能导致一些.append()呼叫比其他呼叫花费更长的时间。还有一个不太严重的问题。如果您使用.insert()在末尾以外的位置向堆栈添加元素,则可能需要更长时间。但是,这通常不是你要对堆栈做的事情。下一个数据结构将帮助您解决您看到的重新分配问题list。使用collections.deque创建一个Python堆栈该collections模块包含deque,这对于创建Python堆栈很有用。deque发音为“deck”,代表“双端队列”。您可以使用同样的方法deque,你上面看到的list,.append()和.pop():>>> from collections import deque >>> myStack = deque() >>> myStack.append('a') >>> myStack.append('b') >>> myStack.append('c') >>> myStack deque(['a', 'b', 'c']) >>> myStack.pop() 'c' >>> myStack.pop() 'b' >>> myStack.pop() 'a' >>> myStack.pop() Traceback (most recent call last): File "<console>", line 1, in <module> IndexError: pop from an empty deque这看起来几乎与list上面的例子相同。此时,您可能想知道为什么Python核心开发人员会创建两个看起来相同的数据结构。
2025年03月01日
6 阅读
0 评论
0 点赞
1
...
14
15
16
17