Python编程语言有哪些鲜为人知但有用的功能?
在Python 2.5中,以下代码引发了TypeError:
>>> class X:
def a(self):
print "a"
>>> class Y(X):
def a(self):
super(Y,self).a()
print "b"
>>> c = Y()
>>> c.a()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in a
TypeError: super() argument 1 must be type, not classobj
Run Code Online (Sandbox Code Playgroud)
如果我更换class X用class X(object),它会奏效.对此有何解释?
可能重复:
Python 2.x陷阱和地雷
今天,多年后我被可变的默认参数再次咬了.除非需要,我通常不会使用可变的默认参数,但我认为随着时间的推移我忘了这一点.今天在应用程序中,我在PDF生成函数的参数列表中添加了tocElements = [],现在每次调用"generate pdf"后,"目录"变得越来越长.:)
我还应该在我的列表中添加什么才能避免?
始终以相同的方式导入模块,例如,from y import x并将import x其视为不同的模块.
不要使用范围代替列表因为range()无论如何都将成为迭代器,以下将失败:
myIndexList = [0, 1, 3]
isListSorted = myIndexList == range(3) # will fail in 3.0
isListSorted = myIndexList == list(range(3)) # will not
Run Code Online (Sandbox Code Playgroud)
使用xrange可能会错误地做同样的事情:
myIndexList == xrange(3)
Run Code Online (Sandbox Code Playgroud)小心捕获多种异常类型:
try:
raise KeyError("hmm bug")
except KeyError, TypeError:
print TypeError
Run Code Online (Sandbox Code Playgroud)
这打印出"嗯bug",虽然它不是一个bug; 看起来我们正在捕获这两种类型的异常,但我们只将KeyError作为变量TypeError捕获,而是使用它:
try:
raise KeyError("hmm bug")
except (KeyError, TypeError):
print TypeError
Run Code Online (Sandbox Code Playgroud)我是一位经验丰富的Perl开发人员,具有一定程度的经验和/或熟悉其他语言(C/C++的工作经验,Java和Scheme的学校经验,以及熟悉其他许多人).
我可能需要在Python中完成一些Web工作(最直接的,与Google App Engine相关).因此,我想问一下如何为那些来自Perl背景的人最好地学习Python提供很好的参考(例如,重点是两者之间的差异以及如何将perl idiomatics翻译成Python惯用语,而不是通用Python参考).以Web开发为中心的东西甚至更好.我会接受任何东西 - 文章,教程,书籍,示例应用程序?
谢谢!
其他人在编写PHP Web应用程序时发现了什么惊喜?编译时类继承是众所周知的问题,但我知道其他几个问题,并且想要尝试构建一个语言的顶层问题列表.
注意:
作为一名高级PHP5开发人员,我担任过多个职位,因此PHP工作支付我的账单,这个问题并不意味着将PHP作为一种语言,因为我使用过的每一种语言都有一些众所周知或不那么知名的惊喜.
蟒蛇:
m=[[0]*3]*2
for i in range(3):
m[0][i]=1
print m
Run Code Online (Sandbox Code Playgroud)
我希望这段代码可以打印出来
[[1, 1, 1], [0, 0, 0]]
Run Code Online (Sandbox Code Playgroud)
但它打印出来
[[1, 1, 1], [1, 1, 1]]
Run Code Online (Sandbox Code Playgroud) 我正在尝试找出这段代码中没有用的东西:
#!/usr/bin/python
import cmd
class My_class (cmd.Cmd):
"""docstring for Twitter_handler"""
def __init__(self):
super(My_class, self).__init__()
if __name__ == '__main__':
my_handler = My_class()
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误
Traceback (most recent call last):
File "main.py", line 12, in <module>
my_handler = My_class()
File "main.py", line 9, in __init__
super(My_class, self).__init__()
TypeError: super() argument 1 must be type, not classobj
Run Code Online (Sandbox Code Playgroud)
如果我将"My_class"的超类更改为对象,它可以正常工作.我哪里错了?
在 Python 中,我可以在整个类中声明属性。例如 :
class Foo:
def __init__(self):
self.a = 0
def foo(self):
self.b = 0
Run Code Online (Sandbox Code Playgroud)
当我有一个包含很多属性的大类时,很难检索我的类中的所有属性。
使用以下代码 (a) 还是下一个以下代码 (b) 更好:
a)在这里,很难找到所有属性:
class Foo:
def __init__(self):
foo_1()
foo_2()
def foo_1(self):
self.a = 0
self.b = 0
def foo_2(self):
self.c = 0
Run Code Online (Sandbox Code Playgroud)
b)在这里,很容易找到所有属性,但它漂亮吗?
class Foo:
def __init__(self):
(self.a, self.b) = foo_1()
self.c = foo_2()
def foo_1(self):
a = 0
b = 0
return (a, b)
def foo_2(self):
c = 0
return c
Run Code Online (Sandbox Code Playgroud)
简而言之,在类中声明属性的约定是什么?
编辑:
当然,这是一个简单的例子,这里不需要改进我的代码。想象一下一个复杂的类,它有很多在_init_ () 中调用的“小方法”(用来分割我的代码,提高可读性)。
我正在实现动态编程算法,我得到了这个错误.这是我的代码:
def shoot(aliens):
s=[0]*10
s[0]=0
s[1]=0
for j in xrange(2,len(aliens)):
for i in xrange(0,j):
s[j]=max(s[i] + min(aliens[j],fib(j-i))) <---Error here
print s[len(aliens)-1]
return s[len(aliens)-1]
def fib(n):
if n == 0:
return 0
if n == 1:
return 1
return fib(n-1) + fib(n-2)
aliens=[1,10,10,1]
print shoot(aliens)
Run Code Online (Sandbox Code Playgroud)
它说:
Traceback (most recent call last):
File "module1.py", line 30, in <module>
print shoot(aliens)
File "module1.py", line 19, in shoot
s[j]=max(s[i] + min(aliens[j],fib(j-i)))
TypeError: 'int' object is not iterable
Run Code Online (Sandbox Code Playgroud)
请帮我
更新:哦,我明白了.我的意思是
s[j]=max(s[i] + min(aliens[j],fib(j-i)))
Run Code Online (Sandbox Code Playgroud)
但我错了.所以,我编辑它,但我不知道如何使用max()来取出数组中最大的.
b=0 …Run Code Online (Sandbox Code Playgroud) 为什么如下:
class A(object):
def __init__(self, var=[]):
self._var = var
print 'var = %s %s' % (var, id(var))
a1 = A()
a1._var.append('one')
a2 = A()
Run Code Online (Sandbox Code Playgroud)
造成:
var = [] 182897439952
var = ['one'] 182897439952
Run Code Online (Sandbox Code Playgroud)
我不明白为什么在使用可选关键字参数时它没有使用列表的新实例,有人能解释一下吗?
python ×9
arguments ×1
coding-style ×1
convention ×1
inheritance ×1
list ×1
performance ×1
perl ×1
php ×1
python-2.x ×1
super ×1