**
Python入门
**
一、控制流语句
在Python中,有三种类型控制流类型:
- 顺序结构
- 分支结构
循环结构
复杂的语句都是由这三个基本控制流组成。
1)顺序结构:普通至上而下的代码结构。
2)分支结构:Python条件语句是通过一条或多条语句的执行结果(True或False)来决定执行的代码块。
if语句可以独立使用,也可搭配else\elif使用。
3)循环结构:用来控制一段语句重复执行。
while循环
for循环
4)终止语句
Break语句:Break语句用来终止最内层循环。
Continue语句:用来跳过最内层当前此的循环。
5)占位语句
pass是空语句,为保证程序结构的完整性,在编写预留功能或语句时方便简洁。
二、错误和异常
程序中的错误都是有意创建并抛出的,所以错误和异常并不可怕,都是可控的。
1.语法错误
Pyhton的语法错误又称为解析错。
语法分析器指出了出错的一行,并在最先找到的错误位置标记一个小箭头。
2.异常
即便Python的语法是正确的,运行时,也有可能发生错误。在运行期检测到的错误被称为异常。
异常以不同的类型出现,这些类型都作为信息的一部分打印出来。
3.异常处理
用来捕获程序中的异常,保证程序的正常运行。
注意:如果except后不写异常类型信息,那么该except将捕获所有异常。
如果需要用一个except捕获多个异常,那么异常信息的位置传入包含多个异常的元祖即可。
三、Python常用函数
1.逻辑判断
1)all(iterable):如果iterable中所有值都为真返回True,如果iterable为空也返回True。
2)any(iterable):有任意一个为真,返回True;如果iterable为空返回False。
3)isinstance():判断参数是否指定类类型。
2.数学相关
1)abs(x):返回一个数的绝对值。如果给出复数,返回值就是该复数的模。
2)divmod(x, y):完成除法运算,返回商和余数。
3)pow(x, y[,z]):返回以x为底,y为指数的幂。如果给出z值,该函数就计算x的y次幂值被z取模的值。
4)round(x[,n]):round()函数返回浮点数x的四舍五入值,如给出n值,则代表舍入到小数点后的位数。
5)min(x, y[,z]),max(x, y[,z]):返回给定参数的最小、最大值,参数可以为序列。
6)sum(iterable):返回序列或集合中数字的总和。
7)bin(x)、hex(x)、oct(x):将数字x转换为二进制串、十六进制串、八进制串
3.序列相关
1)len(object):返回字符串或序列的长度。
2)range([lower,]stop[,step]):range()函数可按参数生成连续的有序整数列表。
3)filter(func, iterable):filter()函数接收一个函数和一个列表。遍历序列中的每个元素,判断每个元素得到布尔值,如果是True则留下。
利用filter(),可以完成很多有用的功能,例如,删除 None 或者空字符串:
def is_not_empty(s):
return s and len(s.strip()) > 0
filter(is_not_empty, [‘test’, None, ”, ‘str’, ’ ‘, ‘END’])
结果:[‘test’, ‘str’, ‘END’]
**注意:**s.strip(rm) 删除 s 字符串中开头、结尾处的 rm 序列的字符。
当rm为空时,默认删除空白符(包括’\n’, ‘\r’, ‘\t’, ’ ‘),如下:
a = ’ 123’
a.strip()
结果: ‘123’
a=’\t\t123\r\n’
a.strip()
结果:’123’
4)map(func, iterable):接收一个函数和一个list,并通过把函数func依次作用在 list 的每个元素上,得到一个新的 list 并返回。
def f(x):
return x*x
print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
输出结果:
[1, 4, 9, 10, 25, 36, 49, 64, 81]
注意:
map()函数不改变原有的 list,而是返回一个新的 list。
利用map()函数,可以把一个 list 转换为另一个 list,只需要传入转换函数。
由于list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,事实上它可以处理包含任意类型的 list,只要传入的函数func可以处理这种数据类型。
5)reduce(func, iterable):reduce()函数接收的参数和 map()类似,一个函数 func,一个list,但行为和 map()不同。reduce()传入的函数 func 必须接收两个参数,reduce()对list的每个元素反复调用函数func,并返回最终结果值。
例如,编写一个f函数,接收x和y,返回x和y的和:
def f(x, y):
return x + y
调用 reduce(f, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:
先计算头两个元素:f(1, 3),结果为4;
再把结果和第3个元素计算:f(4, 5),结果为9;
再把结果和第4个元素计算:f(9, 7),结果为16;
再把结果和第5个元素计算:f(16, 9),结果为25;
由于没有更多的元素了,计算结束,返回结果25。
上述计算实际上是对 list 的所有元素求和。虽然Python内置了求和函数sum(),但是,利用reduce()求和也很简单。
reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,计算:
reduce(f, [1, 3, 5, 7, 9], 100)
结果将变为125,因为第一轮计算是:
计算初始值和第一个元素:f(100, 1),结果为101
6)reversed(sequence):生成一个反转序列的迭代器。
7)sorted():对一个集合进行排序,返回排序后的list。排序本质是比较大小,所以只能同类型之间比较。
sorted([36, 5, 12, 9, 21])
[5, 9, 12, 21, 36]
sorted()也是一个高阶函数,它可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素 x, y,如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。
因此,如果我们要实现倒序排序,只需要编写一个reversed_cmp函数:
def reversed_cmp(x, y):
if x > y:
return -1
if x < y:
return 1
return 0
这样,调用 sorted() 并传入 reversed_cmp 就可以实现倒序排序:
sorted([36, 5, 12, 9, 21], reversed_cmp)
[36, 21, 12, 9, 5]
sorted()也可以对字符串进行排序,字符串默认按照ASCII大小来比较:
sorted([‘bob’, ‘about’, ‘Zoo’, ‘Credit’])
[‘Credit’, ‘Zoo’, ‘about’, ‘bob’]
‘Zoo’排在’about’之前是因为’Z’的ASCII码比’a’小。
8)zip():拉链形式,将对象中的多个可迭代序列输出成一 一对应的zip对象,参数必须是序列,如字符串、元祖、列表。
4.类型转换
1)bool():转换为不二类型。
2)int()、float()、str():转换为整形、浮点型、字符串
3)dict(iterable)、list(iterable)、tuple(iterable):转化为字典、列表、元组类型
4)set(iterable):创建一个无序不重复元素的集合
5)complex():创建一个复数
6)enumerate():返回一个枚举对象
5.系统函数
1)id(obj):返回一个对象的唯一标识值
2)help(obj):调用系统内置的帮助系统
3)type(obj):返回一个对象的数据类型
4)input([提示串]):获取用户输入信息
5)open(file):打开文件
6)print():打印函数
7)eval(‘字符串’):将字符串作为代码运行,较多与input结合
eval(‘2 + 3’)
5
8)chr(x):返回编码为x的字符
9)ord(s):返回1个字符s的编码。chr(ord(‘3’)+1)==>’4’
四、函数的定义
1.函数的定义规则:
函数代码块以def关键词开头,后接函数标识符名称和圆括号()
任何传入参数和自变量必须放在圆括号中间,括号之间可以用于定义参数
-函数第一行语句可以选择性地使用文档字符串 ——用于存放函数说明
函数内容以冒号起始,并且缩进
-return[表达式]结束函数,选择性地返回一个值给调用方。不带return语句相当于返回None。
注意:当return返回多个值时,实际返回的是一个元组。
2.函数参数传递
1)所有参数在Python里都是按引用传递。意味着:如果在函数中更改参数所指的对象,则更改也会反映在原始参数上。
当传入的参数为可变对象时,在函数内部引用该对象时对该对象的修改会直接指向该对象本身。
2)如果在函数内部引用传递的参数在函数内部被覆盖,则不会修改外部的引用。
从本质上讲,函数内部创建的mylist并不和外部mylist冲突,内部的mylist相当于创建了一个局部变量。
3.参数
调用函数时可使用的参数类型:必须参数、命名参数、默认参数、不定长参数、可变关键字参数、命名关键字参数。
1)必须参数:又称位置参数,须以正确的顺序传入函数。调用时的数量和位置必须和声明时的一样。
2)命名参数:又称关键字参数,和函数的调用关系密切,函数的定义不会改变。
3)默认参数:又称缺省参数,调用函数时,若没有传递参数,则使用参数的默认值。默认参数的好处是能降低调用函数的难度。
注:必选参数在前,默认参数在后。
4)不定长参数:又称可变参数。可变参数就是传入的参数个数可变,可以使0个、1个、2个到任意个。
当不确定输入参数个数是多少时,可使用不定长参数,加单星号*。
5)可变关键字参数:又称关键字参数,可将任意数量的关键字参数传递给函数。使用双星号表示传入的参数为命名关键字参数**。
6)命名关键字参数:对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于传入了哪些,就需要在函数内部通过kw检查。
如果要限制关键字参数的名字,可使用命名关键字参数。
和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。
命名关键字参数可以有缺省值,从而简化调用。
注意:当组合使用参数时参数定义顺序为:必须参数、默认参数、不定长参数、命名关键字参数和可变关键字参数。
4.变量作用域
变量的作用域决定了在哪一部分程序可以访问哪个特定变量名称。Python的作用域包含四种:L(Local)局部作用域、E(Enclosing)闭包函数外的函数中、G(Global)全局作用域、B(Built-in)内建作用域。
以L——E——G——B的规则查找,即:在局部找不到,便会去局部外的局部查找,再找不到就到全局找,否则再去内建中找。
注意:Python中只要模块(module)、类(class)、及函数(def、lambda)才会引入新的作用域,其它代码块(如if/elif/else、try/except、for/while)等不会引入新的作用域,也就是说这些语句内定义的变量,外部也可以访问。
- 全局变量和局部变量
1)定义在函数内部的变量拥有一个局部作用域,定义在函数外部的拥有全局作用域。
2)局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。
3)当内部作用域想修改外部作用域的变量时,就用到global和nonlocal关键字。
4)修改嵌套作用域(enclosing作用域,外层非全局作用域)中的变量
5.递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归函数的优点:定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
6.匿名函数
lambda表示匿名函数,冒号前的x表示函数参数。
函数名有个限制,就是只能有一个表达式,不需写return,返回值即表达式的结果。
用匿名函数有个好处,因为函数没有名字,不比担心函数名冲突。
匿名函数也是一个函数对象,也可把匿名函数赋值给一个变量,再利用变量来调用该函数。
Python对匿名函数的支持有限,一些简单情况下可使用匿名函数。
7.闭包函数
内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,称为闭包(Closure)。
闭包的特点是返回的函数还引用了外层函数的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。举例如下:
可能认为调用f1(),f2()和f3()结果应该是1,4,9,但实际结果全部都是 9。
原因就是当count()函数返回了3个函数时,这3个函数所引用的变量 i 的值已经变成了3。由于f1、f2、f3并没有被调用,所以,此时他们并未计算 i*i,当 f1 被调用时:
f1()
9 # 因为f1现在才计算i*i,但现在i的值已经变为3
因此,返回函数不要引用任何循环变量,或者后续会发生变化的变量。
8.装饰器
定义了一个函数,想在运行时动态增加功能,又不想改动函数本身的代码。Python的 decorator 本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数。
Python装饰器的作用:极大地简化代码,避免每个函数编写重复性代码。
打印日志:@log
检测性能:@performance
数据库事务:@transaction
URL路由:@post(‘/register’)
五、模块
模块是一个包含所有定义的函数和变量的文件,后缀名是.py。模块可以被别的程序引入,以使该模块中的函数等功能。
1.模块导入
1)import module1[, module2[,…moduleN]]
2)from modname import name1[, name2[,…nameN]]
3)from modname import name1 as na
注意:
- 通常情况下,每个import语句只导入一个包,方便理解和阅读代码。
一个模块只会被导入一次,不管执行多少次import。这样可以防止导入模块被一遍又一遍的执行。
一个包被导入后源文件被修改是不会立即生效的,可以通过重启Python或显示的重载包。
import importlib
import lib.reload(modulename)不推荐from modname import *,把一个模块的所有内容都导入当前命名空间,因为不知道哪些包被导入当前空间。
2.导入自己编写的内容
六、IO操作
IO在计算机中指Input/Output操作,即输入、输出。
由于程序和运行时数据驻留在内存中,由CPU计算执行,涉及到数据交换的地方,通常是磁盘、网络等。需要IO接口。
1.文件读写
1)读文件
2)字符编码
3)写文件
2.操作文件和目录
3.JSON数据解析
七、日期和时间
Python提供了一个time和calendar模块可用于格式化日期和时间。
时间间隔以秒为单位的浮点小数。
每个时间戳以自1970年1月1日午夜(历元)经过多长时间表示。
1.time
2.Calendar
Calendar模块有很广泛的方法处理年历和月历,例如打印某月的月历。
3.datetime
datetime是处理日期和时间的标准库。
八、类和面向对象
面向对象编程(Objcect Oriented Programming, OOP)是一种程序设计思想,把对象作为程序的基本单元,一个对象包含了数据和操作数据的方法。
Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。
1.类的定义
类实例化后,可以使用其属性。实际上,创建一个类之后,可通过类名访问其属性。
2.类对象
类对象支持两种操作:属性引用和实例化。
属性引用:obj.name
类对象创建后,类命名空间中所有的命名都是有效属性名。
很多类都倾向于将对象创建为有初始状态的。因此,类可能会定义一个名为init()的特殊方法(构造方法),init方法可以有参数,参数通过init()传递到类的实例化操作上:
3.类的方法
在类内部,使用def关键字可为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数。
九、正则表达式
在编写处理字符串的程序或网页时,经常会有查找符合某些规则字符串的需要。正则表达式即用于描述这些规则的工具。
正则表达式是记录文本规则的代码。
1.正则表达式基础
1)元字符
2)字符转义
反斜杠 : \. \*
3)重复
4)字符类
5)分支条件
6)分组
如果想要重复多个字符,可用小括号来指定子表达式(也叫分组),然后可以指定这个子表达式重复的次数。
7)反义
有时需要查找不属于某个简单定义字符类的字符,比如想查找除数字以外,其它任意字符的情况,这时需用反义。
8)贪婪与懒惰
2.re模块
Python通过re模块提供对正则表达式的支持。
使用re的一般步骤:首先,将正则表达式的字符串形式编译为Pattern实例;然后Pattern实例处理文本并获得匹配结果(一个Match实例);最后使用Match实例获得信息,进行其它操作。
re.compile(strPattern[, flag]):
Match对象
Pattern
3.re模块方法
1)match
2)search
3)split
4)findall
5)finditer
6)sub
7)subn