Python语言入门

基础

使用#完成注释

引号的下一行如果有缩进,视为代码块。

布尔值为True,False

布尔值运算符为and,or,not

空值为None

Python中无常量定义,如表示常量,应该写为大写字母,但仍可修改值。

Python中有两种除法,/为浮点除,运算结果为浮点数,//为地板除,运算结果为整数

ASCII码,Unicode编码,UTF-8编码

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输时,就转换为UTF8编码

ord与chr

python中的str与bytes

以Unicode表示的str通过encode()方法可以编码为指定的bytes,使用decode()方法将bytes转为str

list与tuple元组

classmates =['1','2','3']

Classmates=('1','2','3')

python中下标从0开始,可以用负下标

tuple一旦初始化就不能修改

只有1个元素的tuple定义时必须加个逗号,来消除歧义。

Input()返回的数据类型为str

python循环分为for和while两种,可使用break与continue语句

For x in list:

Xxx

While True:

Xxx

dict与set

d={'M':1,'N':2,'O':3}

可使用in与get判断dict中某元素是否存在

set与dict类似,也是一组key的集合,但不存储value

set中元素不可重复,要创建一个set,需要提供一个list作为输入集合

s=set([1,2,3])

不可变对象

函数定义

Def my_abs(x):

pass语句,空操作

判断变量类型isinstance(x, (int, float))

python中函数可以返回多个值,这些值以tuple元组的形式返回

Python还可以使用默认参数,可变参数和关键字参数

Def power(x, m=3,n=2)

调用时,power(x, n=2)

定义默认参数时,默认参数必须指向不可变对象

可变参数

Def calc(*numbers)

在函数内部,numbers接收到的是一个tuple

python允许在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去。

关键字参数允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict

Def person(name,age, **kw)

Extra={'1':1,'2':2,'3':3}

Person('name',11,**extra);此时kw将获得extra的一份拷贝

python可以限制关键字参数的名字,称为命名关键字参数

Def person(name,age,*,city,job);*后参数视为命名关键字参数

python中参数定义顺序必须是:必选参数,默认参数,可变参数,命名关键字参数和关键字参数

递归调用的次数过多,会导致栈溢出。

解决递归调用栈溢出的方法是通过尾递归优化。

尾递归是指在函数返回的时候调用自身本身,并且return语句不能包含表达式,编译器或解释器会做相应优化。

遗憾的是,大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化。

高级特性

在Python中,代码不是越多越好,而是越少越好。代码不是越复杂越好,而是越简单越好。

切片,与Matlab中取元素相似

tuple也可以做切片操作,但操作结果仍是tuple

字符串也可以做切片操作,但操作结果仍是字符串

判断一个对象是否是可迭代对象,isinstance(x,Iterable);

python内置的enumerate函数可以把一个list变成索引-元素对

列表生成式,List Comprehension,是Python内置的非常简单却强大的可以用来创建list的生成式

List(range(1,100))

[x*x, for x in range(1,100)]

[x*x, for x in range(1,100) if x%2==0]

[m*n, for m in range(1,100) for n in range(1,100)]

[d for d in os.listdir('.')]

d={}

[k+'='+v for k,v in d.items()]

[s.lower() for s in L]

Python中一边循环一边计算的机制,称为生成器,generator

将列表生成式的[]改为(),就创建了一个generator,可使用next()函数获得generator的下一个返回值

如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator,可使用next()不断获取yield返回的值

可直接作用于for循环的数据类型有以下几种:

一类是集合类数据类型,如list、tuple、dict、set、str等

一类是generator,包括生成器和带yield的generator function

Iterable vs Iterator

可以被next函数调用并不断返回下一个值得对象称为迭代器,Iterator

Iter()可将非Iterator的Iterable对象转换为Iterator

函数式编程

Python对函数式编程提供部分支持

函数式编程的一大特点是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数

高阶函数 Higher-Order function

把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。

Map/reduce

Filter用于过滤序列,返回值为True保留该元素

Iterator是惰性计算的序列

Sorted,扩展功能的参数有key与reverse

提供闭包功能

关键字lambda表示匿名函数,冒号前面的x表示函数参数

Lambda x:x*x

相当于

Def f(x):

Return x*x

函数对象有一个__name__属性,可拿到函数名字

在代码运行期间动态增加功能的方式,称为装饰器Decorator

本质上,decorator是一个返回函数的高阶函数,

@log

Def now():

Xxx

相当于now=log(now)

偏函数

Int2=functools.partial(int, base=2)

模块

Python中,一个.py文件称为一个模块module

为了避免模块名冲突,python又引入了按目录来组织模块的方法,称为包Package

python中安装第三方模块,是通过包管理工具pip完成的

面向对象编程

Class Student(object):

Def __init__(self,…):

Xxx

Def print(self):

xxx

判断对象类型

isinstance()

type()

dir()获取对象的所有属性与方法

getattr(), setattr(),hasattr()

相同名称的实例属性将屏蔽掉类属性

面向对象高级编程

为了限制动态绑定类的属性,Python允许在定义类的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性

Python内置的@property装饰器就是负责把一个方法变成属性调用的

在设计类的时候,我们优先考虑通过多重继承来组合多个mixin的功能,而不是设计多层次的复杂的继承关系。

定制类

__str__, __repr__,__iter__, __next__,__getitem__,__getattr__,__call__,

使用枚举类

Month = Enum('Month',('Jan','Feb',))

使用元类

type()可动态创建类型

Hello=Type('Hello',(object),dict(hello=fn))

先定义metaclass,再创建类,最后创建实例

错误,调试和测试

try:

except Exception as e:

finally:

Python内置的logging模块可以方便地记录错误信息

抛出错误,raise 。。。

三种调试方法

使用print

使用assert

使用logging

使用pdb

IO编程

With open('file path') as f:

StringIO和BytesIO是在内存中操作str和bytes的方法,使得和读写文件具有一致的接口。

Python的os模块封装了操作系统的目录和文件操作,要注意这些函数有的在os模块中,有的在os.path模块中。

Python语言特定的序列化模块是pickle,但如果要把序列化搞得更通用、更符合Web标准,就可以使用json模块。

virtualenv

virtualenv就是用来为一个应用创建一套“隔离”的Python运行环境。

pip3 install virtualenv

你可能感兴趣的:(Python语言入门)