楼主: Nicolle
598 31

【独家发布】StackOverflow上票数最高的100个Python问题 [推广有奖]

版主

巨擘

0%

还不是VIP/贵宾

-

TA的文库  其他...

Python Programming

SAS Programming

Must-Read Books

威望
16
论坛币
12370629 个
学术水平
2876 点
热心指数
2880 点
信用等级
2693 点
经验
440571 点
帖子
19366
精华
87
在线时间
7471 小时
注册时间
2005-4-23
最后登录
2019-2-22

Nicolle 学生认证  发表于 2019-2-9 01:07:39 |显示全部楼层

本帖隐藏的内容

StackOverflow上票数最高的100个Python问题.zip (78.51 KB)

  1. StackOverflow上票数最高的100个Python问题
  2. 序言
  3. 整理StackOverflow上票数最高的100个Python问题,持续更新与翻译。

  4. 地址
  5. Github地址: https://github.com/geekcircle/stackoverflow-python-top-qa
  6. Gitbook地址: https://geekcircle.org/stackoverflow-python-top-qa
  7. 友情链接
  8. 极客兔兔的小站
  9. 机器学习面试笔试题大全
  10. 贡献者
  11. Dai Jie
  12. Xu Ri
  13. Tijing Wang
复制代码


关键词:OverFlow python stack Over flow

已有 2 人评分经验 热心指数 信用等级 收起 理由
晓七 + 100 精彩帖子
h2h2 + 5 + 5 精彩帖子

总评分: 经验 + 100  热心指数 + 5  信用等级 + 5   查看全部评分

本帖被以下文库推荐

stata SPSS
Nicolle 学生认证  发表于 2019-2-9 02:59:37 |显示全部楼层

1. yield关键字的作用

本帖最后由 Nicolle 于 2019-2-9 03:08 编辑
  1. 1. yield关键字的作用
  2. 题目
  3. "yield"关键字是做什么的?链接

  4. 回答一
  5. 想要理解yield关键字,你必须先理解generators是什么,理解generators之前要先理解iterables.

  6. Iterables
  7. 当你创建一个list,你可以一个个的读其中的元素,一个一个读就叫做iteration:

  8. >>> mylist = [1, 2, 3]
  9. >>> for i in mylist:
  10. ...    print(i)
  11. 1
  12. 2
  13. 3
  14. 这里的mylist就是一个iterable。当你用一个list,你先创建一个list,这就是一个iterable:

  15. >>> mylist = [x*x for x in range(3)]
  16. >>> for i in mylist:
  17. ...    print(i)
  18. 0
  19. 1
  20. 4
  21. 任何你使用“for...in...”的地方就是一个iterable;例如lists,strings,files... 这些iterables使用很方便。因为你可以想读多少读多少,但是你需要把它们都存在内存里面,当你有很多值的时候这样可能就不太好了。

  22. Generators
  23. Generators也是iterators,是一种只能遍历一遍的iterable,Generators并不把所有值都存在内存里,而是在遍历过程中生成这些值:

  24. >>> mygenerator = (x*x for x in range(3))
  25. >>> for i in mygenerator:
  26. ...    print(i)
  27. 0
  28. 1
  29. 4
  30. 这个和使用list一样只是你用()而不是[],只是你不能再次使用形如for i in mygenerator因为它只能被使用一次,它从0开始计算,然后抛弃它再计算1,一个接一个。

  31. Yield
  32. yield是一个关键字类似return的用法,一个函数使用时会返回一个generator。

  33. >>> def createGenerator():
  34. ...    mylist = range(3)
  35. ...    for i in mylist:
  36. ...        yield i*i
  37. ...
  38. >>> mygenerator = createGenerator() # create a generator
  39. >>> print(mygenerator) # mygenerator is an object!
  40. <generator object createGenerator at 0xb7555c34>
  41. >>> for i in mygenerator:
  42. ...     print(i)
  43. 0
  44. 1
  45. 4
  46. 当你知道你的函数会返回很多数据,并且你知道你仅仅需要读取一次这些值的时候,这么用很方便。 想要掌握yield,你需要明白当你调用这个函数的时候,你写的代码并没有实际地在run,而只是返回了一个generator的对象,这里有一些tricky。

  47. 然后,你的代码会在每一次for循环使用这个generator的时候run起来。

  48. 接下来,最难的部分:

  49. 当for循环第一次调用这个generator的时候,你的代码会从最开始运行,直到yield语句,然后他会返回这个循环的第一个值。然后每一次调用,都会再一次运行这个function并且返回下一个值,直到没有值可以返回。 一旦这个function运行到再也不会hit yield语句,这个generator会被视为空,因为这个时候循环结束了,或者你不满足你的if else语句了。
复制代码
回复

使用道具 举报

Nicolle 学生认证  发表于 2019-2-9 03:05:59 |显示全部楼层

2. 什么是元类(metaclass)

本帖最后由 Nicolle 于 2019-2-9 03:08 编辑
  1. 2. 什么是元类(metaclass)
  2. 题目
  3. 什么是元类,我们用它来干什么?链接
复制代码

  1. 3)什么是元类
  2. 元类就是我们创建对象的东东。

  3. 你定义一个类是为了创建对象,对吗?

  4. 但是刚才我们了解到了Python类也是对象。

  5. 元类是创建这些对象的东东。他们是类的类,你可以用这种方式去描述它。

  6. MyClass = MetaClass()
  7. my_object = MyClass()
  8. 我们已经看到了type能让你像这样做。

  9. MyClass = type('MyClass', (), {})
  10. 这是因为type这个函数事实上是一个元类。type是Python在背后用来创建所有类的元类。

  11. 现在你可能想知道,为什么type首字母要小写,而不是写成Type

  12. 我猜,这与语言一致性有关,例如str是创建字符串对象的类,int是创建整数对象d的类,type就是用来创建类对象的类。

  13. 你可以检查__class__属性看到。

  14. 在Python中一切皆对象。包括整数、字符串、函数和类。它们都是对象,而且它们都是由类产生的。

  15. >>> age = 35
  16. >>> age.__class__
  17. <type 'int'>
  18. >>> name = 'bob'
  19. >>> name.__class__
  20. <type 'str'>
  21. >>> def foo(): pass
  22. >>> foo.__class__
  23. <type 'function'>
  24. >>> class Bar(object): pass
  25. >>> b = Bar()
  26. >>> b.__class__
  27. <class '__main__.Bar'>
  28. 现在,如何__class__的__class__是什么呢?

  29. >>> age.__class__.__class__
  30. <type 'type'>
  31. >>> name.__class__.__class__
  32. <type 'type'>
  33. >>> foo.__class__.__class__
  34. <type 'type'>
  35. >>> b.__class__.__class__
  36. <type 'type'>
  37. 因此,元类就是创建类对象的东东。

  38. 如果你愿意,可以称它为"类工厂"。

  39. type是Python使用的内置的元类,当然,你也能创建自己的元类。
复制代码
回复

使用道具 举报

Nicolle 学生认证  发表于 2019-2-9 03:07:09 |显示全部楼层

3. Python中有三目运算符吗

  1. 3. Python中有三目运算符吗
  2. 题目
  3. 如果Python没有三目运算符,是否有可能使用其他数据结构来模拟?链接

  4. 回答一
  5. Python2.5开始加入三目运算符

  6. 语法如下

  7. a if condition else b
  8. 首先计算condition, 然后根据condition的值返回a或b

  9. 例如

  10. >>> 'true' if True else 'false'
  11. 'true'
  12. >>> 'true' if False else 'false'
  13. 'false'
  14. 注意:conditionals是表达式,而非语句,这意味着不能在conditionals中使用赋值、pass或其他语句。

  15. >>> pass if False else x = 3
  16.   File "<stdin>", line 1
  17.     pass if False else x = 3
  18.           ^
  19. SyntaxError: invalid syntax
  20. 在上例中,仅使用if语句即可。

  21. 这个语法在Python社区也引发了很多争论,原因如下

  22. 参数的顺序与C语言、Ruby、Java等不同,Python的初学者易写出bug
  23. 有人认为不方便写(unwieldy),因为这与正常的思维方式(先考虑条件,再考虑效果)相悖
  24. 风格上的原因
  25. 官方文档:

  26. Conditional expressions
  27. Is there an equivalent of C’s ”?:” ternary operator?
复制代码
回复

使用道具 举报

Nicolle 学生认证  发表于 2019-2-9 03:09:28 |显示全部楼层
  1. 4. 如何检查一个文件是否存在
  2. 题目
  3. 不使用try语句,如何检查一个文件是否存在? 链接

  4. 回答一
  5. 如果检查文件存在性的目的是为了打开它,那么使用try语句去尝试打开它会更安全一些。因为先检查然后再打开,虽然检查到存在,但打开之前文件可能被删除或者被移动。

  6. 如果不打算立即打开这个文件,那么使用os.path.isfile

  7. 如果这个路径是一个存在的正常的文件,将返回 True。能跟踪符号链接(follow symbolic links),因此对于相同的路径islink()和isfile()都会返回True

  8. import os.path
  9. os.path.isfile(fname)
  10. 如果不需要确认是否是一个文件

  11. 从 Python 3.4 开始,pathlib模块提供了一种面向对象的方式( Python 2.7 中可以导入 pathlib2)

  12. from pathlib import Path

  13. my_file = Path("/path/to/file")
  14. if my_file.is_file():
  15.     # 文件存在
  16. 检测一个目录

  17. if my_file.is_dir():
  18.     # 目录存在
  19. 检测是否存在,不区分目录和文件

  20. if my_file.exists():
  21.     # 路径存在
  22. 你也可以使用resolve()在 try语句中

  23. try:
  24.     my_abs_path = my_file.resolve():
  25. except FileNotFoundError:
  26.     # 不存在
  27. else:
  28.     # 存在
复制代码
回复

使用道具 举报

Nicolle 学生认证  发表于 2019-2-9 03:11:18 |显示全部楼层
  1. 5. if name == "main": 这句话做了什么事情
  2. 题目
  3. if name == "main": 这句话做了什么事情? 链接

  4. # Threading example
  5. import time, thread

  6. def myfunction(string, sleeptime, lock, *args):
  7.     while True:
  8.         lock.acquire()
  9.         time.sleep(sleeptime)
  10.         lock.release()
  11.         time.sleep(sleeptime)

  12. if __name__ == "__main__":
  13.     lock = thread.allocate_lock()
  14.     thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock))
  15.     thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock))
  16. 回答一
  17. 当python解释器读取一份源文件时,它会执行里面所有的代码。

  18. 当执行代码之前,它会定义一些特殊的变量。例如,当python解释器把源文件作为main程序运行时,它会将变量__name__设置为__main__,而如果这个文件被别的模块引入,__name__则会被设置为这个模块的名字。

  19. 在你的代码中,我们假设这份文件是被当作源文件运行的,也就是说你在命令行输入如下内容:

  20. python threading_example.py
  21. 设置完一些变量以后,它会执行import语句加载一些模块,然后它会解析def语句,创造一个function对象和一个指向这个对象的变量myfunction。然后它会执行if语句判断__name__是否等于 __main__,这里等于,然后它就会执行剩下的代码段。

  22. 这么做的一个理由是,有时你写了一个直接可以被运行的py文件。然而,它也可以被其他模块import使用,我们做这样一个是否是main的判断,你可以让那些代码仅仅在文件作为main程序运行时运行,而在别人只是想引用你的模块使用你的其他函数时不运行那些代码。
复制代码
回复

使用道具 举报

Nicolle 学生认证  发表于 2019-2-9 03:12:22 |显示全部楼层
  1. 6. 在Python中调用外部命令
  2. 题目
  3. 如何从Python脚本中调用外部命令(就像我在Unix shell或Windows命令提示符中敲入它一样)? 链接

  4. 回答一
  5. 查看标准库中的子流程(subprocess)模块:

  6. from subprocess import call
  7. call(["ls", "-l"])
  8. 子流程(subprocess)vs系统(system)的优点是它更灵活(您可以获得stdout、stderr、“真正的”状态代码、更好的错误处理等)。

  9. 官方的文档建议使用子流程模块,os.system()作为备选:

  10. 子过程(subprocess)模块提供了更强大的工具来生成新进程和检索结果;相比使用[os.system()]函数更推荐使用该模块。

  11. 在子过程(subprocess)文档中用子流程模块替换旧函数(Replacing Older Functions with the subprocess Module)”可能有一些有用的方法。

  12. 子过程模块的官方文件:

  13. Python 2 - subprocess
  14. Python 3 - subprocess
复制代码
回复

使用道具 举报

Nicolle 学生认证  发表于 2019-2-9 03:13:46 |显示全部楼层
  1. 7. 如何用一行代码合并2个字典
  2. 题目
  3. 有2个Python字典,想写一行代码能返回2个字典合并后的结果,但是 update() 并不返回合并后的结果,而是就地修改其中的一个字典。

  4. >>> x = {'a':1, 'b': 2}
  5. >>> y = {'b':10, 'c': 11}
  6. >>> z = x.update(y)
  7. >>> print(z)
  8. None
  9. >>> x
  10. {'a': 1, 'b': 10, 'c': 11}
  11. 怎样才能在z中得到合并结果,而不是在x中

  12. 另外,dict.update()方法遇到冲突时保留最后一个键值对也是我所期望的。 链接

  13. 回答一
  14. 如何用一行代码合并2个字典

  15. 对于字典x, y, z是在x中替换并合并了y中的值的字典。

  16. Python3.5+
  17. z = {**x, **y}
  18. Python2, (或者3.4 或更低版本) 可以写一个函数
  19. def merge_two_dicts(x, y):
  20.     z = x.copy()   # z初始化为x
  21.     z.update(y)    # 用y的值修改z,返回值None
  22.     return z
  23. 接着

  24. z = merge_two_dicts(x, y)
复制代码
回复

使用道具 举报

Nicolle 学生认证  发表于 2019-2-9 03:14:25 |显示全部楼层
  1. 8. 如何创建一个不存在的目录
  2. 题目
  3. 如何用最优雅的方式检查一个目录是否存在,如果不存在的话就创建它? 链接

  4. 回答一
  5. 尝试用os.path.exists,并且用os.makedirs来创建目录:

  6. import os
  7. if not os.path.exists(directory):
  8.     os.makedirs(directory)
  9. 实际上这里有一个race condition - 如果目录在os.path.exists和os.makedirs之间被创建了,那么os.makedirs将会失败并产生OSError这个错误。然而不幸的是,如果仅仅catch住这个OSSError然后继续的话并不是十分安全的,因为这样会忽略掉其他的一些错误原因,比如因为没有权限或者磁盘已满。

  10. 有一个方法是catch住这个error并且检查他的errorcode(see Is there a cross-platform way of getting information from Python’s OSError):

  11. import os, errno

  12. try:
  13.     os.makedirs(directory)
  14. except OSError as e:
  15.     if e.errno != errno.EEXIST:
  16.         raise
  17. 当然你还可以第二次检查os.path.exists,但是如果有人在第一次检查之后创建目录,然后在第二次检查之前又把目录删了,那我们仍然是被耍了。

  18. 综上,应该依据具体的情况来决定采用哪种实现方式。
复制代码
回复

使用道具 举报

Nicolle 学生认证  发表于 2019-2-9 03:14:59 |显示全部楼层
  1. 9. 如何根据值对字典排序
  2. 题目
  3. 我有一个从数据库的两个字段中读取值的字典:一个字符串字段和一个数字字段。字符串字段是惟一的,所以这是字典的key。 我可以对键进行排序,但是如何根据值排序呢? 注意:我读过Stack Overflow的问题我如何用Python中的dictionary来对字典排序?而且可能会改变我的代码来拥有一个字典列表,但是因为我不需要一个字典列表,所以我想知道是否有一个更简单的解决方案。 链接

  4. 回答一
  5. 对字典进行排序是不可能的,只是为了得到一个已排序的字典的表示。字典本身是没有顺序的,但是其他类型,如列表和元组,则不是。因此,您需要一个有序的数据类型来表示排序的值,这将是一个列表——可能是一个元组列表。

  6. 例如:

  7. import operator
  8. x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
  9. sorted_x = sorted(x.items(), key=operator.itemgetter(1))
  10. sorted_x将是由每个元组中的第二个元素排序的元组列表。dict(sorted_x)== x。

  11. 而对于那些希望按键而不是值的人:

  12. import operator
  13. x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
  14. sorted_x = sorted(x.items(), key=operator.itemgetter(0))
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 我要注册

GMT+8, 2019-2-23 03:16