python学习

学习地址廖雪峰的官方网站.

    • python基础
    • 函数
      • 尾递归
    • 高级特性
      • 切片
    • 函数式编程
      • 闭包
      • 装饰器decorator
    • 面向对象编程
      • 如何访问私有成员变量
      • 传入参数 VS静态语言如JAVA
      • 实例属性不能与类属性同名
      • 限制动态增加类的属性
    • 错误 调试和测试
      • 异常处理
      • 自定义异常
      • debug的几种方式
    • IO
      • 读取文件
      • 大文件的读取
      • 在Python中文件读写是通过open函数打开的文件对象完成的使用with语句操作文件IO是个好习惯
      • StringIO和BytesIO
    • 数据库连接

python基础

(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没有截取函数, 使用切片非常方便

函数式编程

闭包

返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。

装饰器decorator

必须在定义的包装函数前面加上@functools.wraps(func)。

面向对象编程

如何访问私有成员变量

python解释器会将类的私有变量(前缀__的变量, 如Student类的__name)的名称改为_Student__name, 所以不能直接访问__name, 但是可以用_className__fieldName的方式访问

传入参数 VS静态语言(如JAVA)

实例属性不能与类属性同名

在编写程序的时候,千万不要把实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性

限制动态增加类的属性

通过增加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')

debug的几种方式

  • print() 简单粗暴有效, 最大的坏处是将来还得删掉它,想想程序里到处都是print(),运行结果也会包含很多垃圾信息。
  • assert 语句本身就会抛出AssertionError, 程序中如果到处充斥着assert,和print()相比也好不到哪去。不过,启动Python解释器时可以用-O参数来**关闭**assert
$ python3 -O err.py
Traceback (most recent call last):
  ...
ZeroDivisionError: division by zero
  • logging 可以配置打印的日志级别
import logging
logging.basicConfig(level=logging.INFO)
  • pdb调试器 可以单步调试, 随时查看运行状态

IO

读取文件

>>> 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

在Python中,文件读写是通过open()函数打开的文件对象完成的。使用with语句操作文件IO是个好习惯。

StringIO和BytesIO

StringIO和BytesIO是在内存中操作str和bytes的方法,使得和读写文件具有一致的接口。需要注意的是StringIO不需要close,需要close()的stream也不建议手动close,而是用with自动close

数据库连接

Mysql的占位符是%s

cursor.execute('select * from user where id = %s', ['1'])

执行INSERT等操作后要调用commit()提交事务;

你可能感兴趣的:(python3)