- 关键字参数要在位置参数后边。
In [11]: def f(a,b):
...: print(a,b)
...:
In [12]: f(a=0,5)
File "<ipython-input-12-5041dccca78c>", line 1
f(a=0,5)
^
SyntaxError: positional argument follows keyword argument
In [13]: f(0,5)
0 5
In [14]: f(0,b=8)
0 8
- 下列代码运行结果是?
a='a'
print(a>'b' or 'c')
答案:c。逻辑运算符两侧如果是bool类型,那还好。如果不是,就要当心了。因为这时它返回的不是True或者False,而是运算符两边的某一个值。python的逻辑运算符是很“懒”的,and的时候,如果第一个为真,他就直接返回第一个值,不会检查后边的;如果第一个为假,他就检查后边的,返回后边的值。同理,or的时候,第一个为真就直接返回第一个的值;反之,他就检查后边的,返回后边的值。
4. Python中单下划线_foo与双下划线__foo与__foo__的成员,下列说法正确的是?
A. _foo 不能直接用于’from module import *’
B. __foo解析器用_classname__foo来代替这个名字,以区别和其他类相同的命名
C. __foo__代表python里特殊方法专用的标识
D.__foo 可以直接用于’from module import *’
答案:ABC.
- 名称前的单下划线(如:_shahriar),程序员使用名称前的单下划线,用于指定该名称属性为“私有”。这有点类似于惯例,为了使其他人(或你自己)使用这些代码时将会知道以“_”开头的名称只供内部使用。正如Python文档中所述:
以下划线“_”为前缀的名称(如_spam)应该被视为API中非公开的部分(不管是函数、方法还是数据成员)。此时,应该将它们看作是一种实现细节,在修改它们时无需对外部通知。
正如上面所说,这确实类似一种惯例,因为它对解释器来说确实有一定的意义,如果你写了代码“from <模块/包名> import *”,那么以“_”开头的名称都不会被导入,除非模块或包中的"__all__"列表显式地包含了它们。
- 名称前的双下划线(如:__shahriar)
名称(具体为一个方法名)前双下划线(__)的用法并不是一种惯例,对解释器来说它有特定的意义。Python中的这种用法是为了避免与子类定义的名称冲突。Python文档指出,“__spam”这种形式(至少两个前导下划线,最多一个后续下划线)的任何标识符将会被“_classname__spam”这种形式原文取代,在这里“classname”是去掉前导下划线的当前类名。
- 名称前后的双下划线(如:init)
这种用法表示Python中特殊的方法名。其实,这只是一种惯例,对Python系统来说,这将确保不会与用户自定义的名称冲突。通常,你将会覆写这些方法,并在里面实现你所需要的功能,以便Python调用它们。例如,当定义一个类时,你经常会覆写“init”方法。
虽然你也可以编写自己的特殊方法名,但不要这样做。
4. 筛法求素数个数
import math
def sieve(size):
sieve= [True] * size
sieve[0] = False
sieve[1] = False
for i in range(2, int(math.sqrt(size)) + 1):
k= i * 2
while k < size:
sieve[k] = False
k += i
return sum(1 for x in sieve if x)
print(sieve(10000000000))