Python:What the f*ck Python(上) (3)

可以通过将循环变量作为命名变量传递给函数来获得预期的结果。为什么这样可行?因为这会在函数内再次定义一个局部变量。

funcs = [] for x in range(7): def some_func(x=x): return x funcs.append(some_func)

Output:

>>> funcs_results = [func() for func in funcs] >>> funcs_results [0, 1, 2, 3, 4, 5, 6] 10. is not ... is not is (not ...)/is not ... 不是 is (not ...) >>> 'something' is not None True >>> 'something' is (not None) False

说明:
is not 是个单独的二元运算符,与分别使用 is 和 not 不同。

11. The surprising comma

略过,我想没人会在函数的最后一个参数后面再加一个逗号吧!
况且,尾随逗号的问题已经在 Python 3.6 中被修复了。

12. Backslashes at the end of string >>> print("\\ C:\\") \ C:\ >>> print(r"\ C:") \ C: >>> print(r"\ C:\") File "<stdin>", line 1 print(r"\ C:\") ^ SyntaxError: EOL while scanning string literal

说明:
在以 r 开头的原始字符串中,反斜杠并没有特殊含义。解释器所做的只是简单的改变了反斜杠的行为,因此会直接传递反斜杠及后一个的字符。这就是反斜杠在原始字符串末尾不起作用的原因。

13. not knot! >>> not x == y True >>> x == not y File "<input>", line 1 x == not y ^ SyntaxError: invalid syntax

说明:
一句话,== 运算符的优先级要高于 not 运算符。

14. Half triple-quoted strings >>> print('wtfpython''') wtfpython >>> print("wtfpython""") wtfpython >>> # 下面的语句会抛出 `SyntaxError` 异常 >>> # print('''wtfpython') >>> # print("""wtfpython")

说明:
''' 和 """ 在 Python中也是字符串定界符,Python 解释器在先遇到三个引号的的时候会尝试再寻找三个终止引号作为定界符,如果不存在则会导致 SyntaxError 异常。

而 Python 提供隐式的字符串链接:

>>> print("wtf" "python") wtfpython >>> print("wtf""") # 相当于 "wtf" "" wtf 15. Midnight time doesn't exist? from datetime import datetime midnight = datetime(2018, 1, 1, 0, 0) midnight_time = midnight.time() noon = datetime(2018, 1, 1, 12, 0) noon_time = noon.time() if midnight_time: print("Time at midnight is", midnight_time) if noon_time: print("Time at noon is", noon_time)

Output:

Time at noon is 12:00:00

midnight_time 并没有被输出。
说明:
在Python 3.5之前,如果 datetime.time 对象存储的UTC的午夜0点, 那么它的布尔值会被认为是 False。
这个我特意下了个 python 3.4 验证了下,真是这样。

16. What's wrong with booleans mixed_list = [False, 1.0, "some_string", 3, True, [], False] integers_found_so_far = 0 booleans_found_so_far = 0 for item in mixed_list: if isinstance(item, int): integers_found_so_far += 1 elif isinstance(item, bool): booleans_found_so_far += 1

Output:

>>> booleans_found_so_far 0 >>> integers_found_so_far 4

说明:
布尔值是 int 的子类

>>> isinstance(True, int) True >>> isinstance(False, int) True

在引入实际 bool 类型之前,0 和 1 是真值的官方表示。为了向下兼容,新的 bool 类型需要像 0 和 1 一样工作。

17. Class attributes and instance attributes

class A: x = 1 class B(A): pass class C(A): pass

Output:

>>> A.x, B.x, C.x (1, 1, 1) >>> B.x = 2 >>> A.x, B.x, C.x (1, 2, 1) >>> A.x = 3 >>> A.x, B.x, C.x (3, 2, 3) >>> a = A() >>> a.x, A.x (3, 3) >>> a.x += 1 >>> a.x, A.x (4, 3)

class SomeClass: some_var = 15 some_list = [5] another_list = [5] def __init__(self, x): self.some_var = x + 1 self.some_list = self.some_list + [x] self.another_list += [x]

Output:

>>> some_obj = SomeClass(420) >>> some_obj.some_list [5, 420] >>> some_obj.another_list [5, 420] >>> another_obj = SomeClass(111) >>> another_obj.some_list [5, 111] >>> another_obj.another_list [5, 420, 111] >>> another_obj.another_list is SomeClass.another_list True >>> another_obj.another_list is some_obj.another_list True

说明:

类变量和实例变量在内部是通过类对象的字典来处理(__dict__ 属性),如果在当前类的字典中找不到的话就去它的父类中寻找。

+= 运算符会在原地修改可变对象,而不是创建新对象。因此,修改一个实例的属性会影响其他实例和类属性。

18. yielding None

some_iterable = ('a', 'b') def some_func(val): return "something"

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdgwf.html