学习地址廖雪峰的官方网站.
(1)定义的不是tuple,是1
这个数!这是因为括号()
既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1
。
所以,只有1个元素的tuple定义时必须加一个逗号,
,来消除歧义:
>>> t = (1,)
>>> t
(1,)
注意,dict内部存放的顺序和key放入的顺序是没有关系的。
pass语句什么都不做,那有什么用?实际上pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。
任意一个函数, 都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。, 比如函数
def func(a, b, c=0, *args, **kw):
print 'a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw
可以这样调用(注意调用结果), 参数定义的顺序必须是:必选参数、默认参数、可变参数和关键字参数。:
>>> args = (1, 2, 3, 4)
>>> kw = {'x': 99}
>>> func(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {'x': 99}
为了解决递归时, 可能发生栈溢出的问题, 但是python并没有对尾递归做处理, 所以即使写了尾递归, 也无法避免栈溢出(java同样未对尾递归做任何优化)
>>>[-1:5:2] #第一个参数是开始下标, 第二个参数是结束下标, 第三个参数是切片跳跃长度(每n个截取), 同样是前包含后不包含
切片可以针对List/Tuple/String类型都可以, python的String没有截取函数, 使用切片非常方便
返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
必须在定义的包装函数前面加上@functools.wraps(func)。
python解释器会将类的私有变量(前缀__的变量, 如Student类的__name)的名称改为_Student__name, 所以不能直接访问__name, 但是可以用_className__fieldName的方式访问
在编写程序的时候,千万不要把实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性
通过增加shots可以做到
class Student(object):
__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
注意 使用slots要注意,slots定义的属性仅对当前类实例起作用,对继承的子类是不起作用的
不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。这样一来,就大大减少了写try…except…finally的麻烦。
只有在必要的时候才定义我们自己的错误类型。如果可以选择Python已有的内置的错误类型(比如ValueError,TypeError),尽量使用Python内置的错误类型。
如果要抛出错误,首先根据需要,可以定义一个错误的class,选择好继承关系,然后,用raise语句抛出一个错误的实例:
# err_raise.py
class FooError(ValueError):
pass
def foo(s):
n = int(s)
if n==0:
raise FooError('invalid value: %s' % s)
return 10 / n
foo('0')
$ python3 -O err.py
Traceback (most recent call last):
...
ZeroDivisionError: division by zero
import logging
logging.basicConfig(level=logging.INFO)
>>> file = open("C:\\Users\\admin\\Pictures\\test.txt", 'r') #注意\\ 单\会发生异常, 需要\\转义
>>> file.read()
'Hello, world!!!\nHello, Jack Chan!!!'
>>> file.close()
由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try … finally来实现:
try:
f = open('C:\\Users\\admin\\Pictures\\test.txt', 'r')
print(f.read())
finally:
if f:
f.close()
还可以使用 with … as … 类似JAVA8的try … with … resource 语句
with open('/path/to/file', 'r') as f:
print(f.read())
当文件非常大时, 比如10G就不能直接使用read()到内存中了, 如果是文本可以使用readline()一行一行的读取, 其他文件可以通过反复调用read(size)
with open("C:\\Users\\admin\\Pictures\\test.txt", 'r') as f:
done = False
while not done:
aLine = f.readline()
if aLine != '':
print(aLine)
else:
done = True
StringIO和BytesIO是在内存中操作str和bytes的方法,使得和读写文件具有一致的接口。需要注意的是StringIO不需要close,需要close()的stream也不建议手动close,而是用with自动close
Mysql的占位符是%s
cursor.execute('select * from user where id = %s', ['1'])
执行INSERT等操作后要调用commit()提交事务;