Python的特点
Python是一种兼具编译型和解释型特性,兼顾过程式、函数式和面向对象编程范式的通用型高级程序设计语言,其特点如下:简单易用,兼具编译型和解释型语言的优点,高级语言,跨平台,面向对象,支持多种编程范式,丰富强大的第三方代码库,方便与其他语言集成,开源免费
- Python是一种面向对象的、兼具编译型和解释型特点的高级动态类型计算机程序设计语言
- 与C、C++等编译型语言相比,不需要独立的编译过程,程序编写完成后即可运行,适用于脚本等需要快速编码的日常任务
- 语法简洁,使用缩进来定义语句块
- 支持命令式程序设计、面向对象程序设计、函数式编程等
包含了功能完备的标准库,能够胜任常见应用程序的开发
- 跨平台、开源、免费
Python兼具编译型和解释型语言的特点,其源程序的执行过程分为两步:
-
- 源代码被自动编译生成字节码
- Python虚拟机解释执行字节码
在运行时,Python源程序先被自动编译成一连串字节码。 “字节码”这一名称源自其指令集由一个字节的操作码和一个字节的可选参数构成
与普通编译型程序生成的机器码不同,字节码不能由CPU直接执行,而需要由Python虚拟机解释执行,它实际上是针对Python虚拟机的一组指令。也正因为如此,字节码与底层的硬件和操作系统无关,从而使得Python源程序无须修改即可在多个平台上运行。
- 缩进:Python使用缩进界定代码块的起始
- 变量名:变量名可以包括字母、数字和下画线,但不可以数字开头
- 行长度:一行不要超过79个字符,这样的代码在小屏显示器上阅读体验更好,还便于在大屏显示器上并排阅读多个代码文件,在实践中可适当放宽,在同一个项目中保持一致
- 跨行书写:括号内元素可以跨行书写,这时第二行开头需较第一行多增加一级缩进,或与左括号后一字符垂直对齐
- 空格:对用于分隔列表元素、函数参数等的逗号,在其后要加一个空格
- 空行:在源程序文件顶层定义的类与类、函数与函数、类与函数之间要空两行
- 模块导入:一个import语句只导入一个模块,但在一个from … import语句中可以同时导入多个对象
- 注释:单行注释以符号“#”开头,多行注释用三个单引号“' ' '”或者三个双引号“'' '' ''”括起来。
- 源程序文件的编码:在编写Python 3的源代码时使用其默认的UTF-8编码
列表(list)——若干个对象的有序聚合
列表中存储的每一个对象称为一个元素,用逗号进行分隔。各个元素的数据类型可以相同,也可以不同,甚至是另一个列表。列表属于可变对象(mutable object),一个对象在创建之后其值仍可被修改,可以通过下标索引配合赋值操作来改变列表中的元素。(del x[I], del x删除元素和列表)
1.append()方法将待添加的对象作为一个整体一次性加入原列表末尾不同,extend()方法是将一个序列中的对象依次添加到原列表末尾
2. 列表对象的insert(index, item)方法将元素item添加至由参数index指定的列表下标位置之前
2. 列表对象的pop([index])方法删除并返回指定位置下标index处的元素x.pop(),未制定index则删除并返回列表中最后一个元素
3. 使用列表对象的remove(item)方法删除列表中首次出现的指定元素item,如果列表中不存在该元素,则会产生异常
例子:在调用pop()方法和remove()方法时会造成列表长度的收缩,由此带来的元素位置索引的变化有时会产生出乎意料的结果,如使用不当,可能带来难以察觉的错误使用“在循环内多次调用remove()”这样的方法删除列表中所有的指定元素,其结果的正确与否与输入数据有关,当待删除的元素连续出现时,就会出现错误,例如:
一种正确的做法是先生成一个原列表的“拷贝”,这是一个独立于原列表的新对象,然后在遍历该复制的对象的同时修改原列表,例如:
列表对象的index(item)方法获取指定元素item首次出现的下标,若列表对象中不存在指定元素,则产生异
:
>>> x
[1, 2, 3]
>>> x.index(3)
2
>>> list(),[]
([], [])
>>> type(list()),type([])
(<class 'list'>, <class 'list'>)
列表对象的count(item)方法统计指定元素item在列表对象中出现的次数
列表对象的sort()方法对列表元素进行原地排序,默认以升序排序,可以使用关键字参数reverse=True令其以降序排序
还可以使用关键字参数key指定带有一个参数的函数,用于从每个列表元素中提取比较键(例如,key=str.lower),对应于列表中每一项的键会被计算一次,然后在整个排序过程中使用,例如:
sorted()不改变原列表,而将排序结果以一个新的列表对象的形式返回
>>> x = [1,3,6,2,3,4]
>>> y = sorted(x)
>>> y
[1, 2, 3, 3, 4, 6]
- 与列表不同的是,元组不支持原地修改,即元组一经创建,其中的元素用任何方式都无法改变,这意味着其长度也是固定的,不能增加或缩短。如要定义空元组,可以使用不包含任何内容的一对空圆括号“()”或内置函数>>> x = tuple()
元组对象仍有count()和index()方法,它们的作用与列表中的相同,调用后不会修改元组对象
元组对象没有sort()和reverse()方法,但内置函数sorted()和reversed()可以接收元组作为输入并将结果作为新对象返回
>>> print('%d,%.4f,%s'%(1,3.14,'拍'))
1,3.1400,拍
Python中的可变对象有列表、字典、集合,不可变对象有元组、字符串、整数、浮点数、布尔型等
1.与用整数下标作为索引的列表不同,字典以键为索引,键可以是任意不可变类型,通常是数字或字符串
2.如果一个元组只包含字符串、数字或其他元组,那么该元组也可以用作键;但如果元组直接或间接地包含可变对象,那么它就不能用作键
- key: value 项目之间用逗号分隔,所有的项目放在一对大括号“{}”中,字典中的键不允许重复
>>> value = d.get('apple',4)
>>> value
4
>>> d
{'one': 2, 'two': 3}
>>> d.setdefault('apple',4)
4
>>> d
{'one': 2, 'two': 3, 'apple': 4}
集合中的元素是唯一的,不可重复,且只能是不可变对象,如数字、字符串、元组等
>>> s = set((1,2,2,3))
>>> s
{1, 2, 3}
>>> s=set()
>>> s
set()
>>> type(s)
>>> choice = 'banana'
>>> print({'spam':1,'eggs':2}.get(choice,'bad choice'))
bad choice
定义函数:
def func(arg1, arg2, arg3):
"""Docstring comments"""
statements
lambda表达式,用于创建简单函数,其形式为:lambda arg1, arg2, ... , argN: expression
lambda表达式会生成一个函数对象,可以将其赋给变量,供之后调用
lambda表达式只允许包含一个表达式,该表达式的结果作为函数的返回值,且不允许包含其他的复杂语句
迭代器
iter()接收一个可迭代对象,返回对应的迭代器
next()接收一个迭代器对象,返回对应的可迭代对象中的一个结果,直至无可返回时产生StopIteration异常
生成器(generator)提供了一种“尽可能延迟创建结果”的工具
如图所示,生成器表达式类似于列表推导式,与列表推导式不同的是,生成器表达式使用圆括号作为左右界定符
生成器对象是可迭代的,其采用了惰性计算(或称延时求值)机制。当序列较长且每次只需要获取一个元素时,应该优先考虑使用生成器表达式
类的实例
- 在Python中使用继承由已有类创建新类,只需在定义新类时按照形如class SubClass(SuperClass)的形式将所继承的超类名写在括号中
- 新创建的子类通过继承获得可以超类所有的属性和方法,也可以增加超类没有的属性和方法,还可以重新定义超类已有的属性和方法,从而获得与超类不同的功能
- Python支持多重继承,可以在子类定义的括号中为其指定多个超类
实例方法的调用离不开实例对象
面向对象技术从Python内置的Exception类继承定义自己的异常类型
- BaseException是一切异常类的基类,它有四个子类:Exception、GeneratorExit、KeyboardInterrupt和SystemExit
- 其中的GeneratorExit、KeyboardInterrupt和SystemExit是与系统退出相关的异常,与一般的应用程序关系不大
1.使用try … except语句捕捉并处理异常,将可能产生异常的代码加上缩进置于关键字try之下,待捕捉的异常类的名字置于关键字except之后,再加上缩进后的用于处理异常的代码
2. try … except语句可以附带一个else子句,其必须放在所有的except子句之后
当执行完try代码块中的内容而没有产生任何异常时才会执行else子句中的内容
3. 如果在try代码块之后跟随着finally子句,那么Python一定会执行finally子句内的代码,而无论try代码块执行时是否发生了异常
4. 使用with … as生成的对象所对应的终止或清理行为都将被自动执行,无论前期的处理步骤中是否发生异常。这样看来,with … as的作用与try … except … finally语句相同
assert test[, argument]
对于上面的assert语句,如果条件表达式test为True,则什么都不做;如果test为False,则产生名为AssertionError的Python内置异常,argument是提供给构造AssertionError类实例的可选参数。
- 一个Python源文件也是一个模块
- 模块最重要的功能是实现了代码重用:模块中的程序代码以文件的形式被存储起来,可以随时运行
- 模块是Python中层次最高的代码单元,起到了分割Python命名空间的作用
- 模块中定义的变量名只为模块自己所有,各个模块中的变量彼此独立,一个模块只有先进行导入操作,才能使用被导入模块中的变量,使用这种隐式的方式让变量名从属于模块,有助于消除命名冲突