python简介
Python 有两种主要的方式来完成你的要求:语句和表达式(函数、算术表达式等)。
程序输出,print语句及“HelloWorld!”
- 通常当你想看变量内容时,你会在代码中使用 print 语句输出。不过在交互式解释器中, 你可以用 print 语句显示变量的字符串表示,或者仅使用变量名查看该变量的原始值。
- 在仅用变量名时,输出的字符串是被用单引号括起来了的。这是为了让非字符串对象也能以字符串的方式显示在屏幕上–即它显示的是该对象的字符串表示,而不仅仅是字符串本身。引号表示你刚刚输入的变量的值是一个字符串。
- print 语句调用 str()函数显示对象,而交互式解释器则调用 repr()函数来显示对象。
程序输入和 raw_input()内建函数
- 下划线
_
在解释器中有特别的含义,表示最后一个表达式的值。 - Python的print语句,与字符串格式运算符
%
结合使用,可实现字符串替换功能,这一点和 C 语言中的printf()函数非常相似。 - 从用户那里得到数据输入的最容易的方法是使用raw_input()内建函数。它读取标准输入,并将读取到的数据赋值给指定的变量。
注释
和大部分脚本及 Unix-shell 语言一样,Python 也使用 # 符号标示注释,从 # 开始,直
到一行结束的内容都是注释。
有一种叫做文档字符串的特别注释。你可以在模块、类或者函数的起始添加一个字符串,
起到在线文档的功能。与普通注释不同,文档字符串可以在运行时访问,也可以用来自动生成文档。
运算符
+ - * / // % **
- Python 有两种除法运算符,单斜杠用作传统除法, 双斜杠用作浮点除法(对结果进行四舍五入)。传统除法是指如果两个操作数都是整数的话, 它将执行是地板除(取比商小的最大整数),而浮点除法是真正的除法,不管操作数是什么类型,浮点除法总是执行真正的除法。
- Python 目前支持两种“不等于”比较运算符, != 和 <>。
- Python 也提供了逻辑运算符:
and or not
变量和赋值
- 变量名仅仅是一些字母开头的标识符–所谓字母开头–意指大写或小写字母,另外还包括下划线( _ ). 其它的字符可以是数字、字母或下划线。
- Python 变量名是大小写敏感的
- Python 是动态类型语言,也就是说不需要预先声明变量的类型。变量的类型和值在赋值那一刻被初始化。
- Python 也支持增量赋值,也就是运算符和等号合并在一起。
- Python 不支持 C 语言中的自增 1 和自减 1 运算符, 这是因为 + 和 - 也是单目运算符, Python 会将
--n
解释为-(-n)
从而得到 n , 同样++n
的结果也是 n。
数字
Python 支持五种基本数字类型:
- int (有符号整数)
- long (长整数)
- bool (布尔值)
- float (浮点值)
- complex (复数)
字符串
- Python 中字符串被定义为引号之间的字符集合。
- Python 支持使用成对的单引号或双引号, 三引号(三个连续的单引号或者双引号)可以用来包含特殊字符。
- 使用索引运算符
( [ ] )
和切 片运算符( [ : ] )
可以得到子字符串。 - 字符串有其特有的索引规则:第一个字符的索引是 0, 最后一个字符的索引是 -1。
- 加号( + )用于字符串连接运算,星号( * )则用于字符串重复。
列表和元组
可以将列表和元组当成普通的“数组”,它能保存任意数量任意类型的 Python 对象。和数 组一样,通过从 0 开始的数字索引访问元素,但是列表和元组可以存储不同类型的对象。
列表和元组有几处重要的区别:
- 列表元素用中括号
([ ])
包裹,元素的个数及元素的值可以改变。 - 元组元素用小括号
(( ))
包裹,不可以更改(尽管他们的内容可以)。元组可以看成是只读的列表。 - 通过切片运算
( [ ] 和 [ : ] )
可以得到子集。 - 元组也可以进行切片运算,得到的结果也是元组(不能被修改)。
字典
字典是 Python 中的映射数据类型,工作原理类似 Perl 中的关联数组或者哈希表,由键- 值(key-value)对构成。几乎所有类型的 Python 对象都可以用作键,不过一般还是以数字或者字符串最为常用。
代码块及缩进对齐
代码块通过缩进对齐表达代码逻辑而不是使用大括号,因为没有了额外的字符,程序的可读性更高。而且缩进完全能够清楚地表达一个语句属于哪个代码块。当然,代码块也可以只有一个语句组成。
if语句
if expression1:
if_suite
elif expression2:
elif_suite
else:
else_suite
while 循环
while expression:
 while_suite
for循环和range()内建函数
Python 中的 for 循环与传统的 for 循环(计数器循环)不太一样, 它更象 shell 脚本里 的 foreach 迭代。Python 中的 for 接受可迭代对象(例如序列或迭代器)作为其参数,每次迭代其中一个元素。
因为我们要使用的数值范围可能会经常变化,Python提供了一个 range()内建函数来生成这种列表。
range()函数经常和 len()函数一起用于字符串索引。
这些循环有一个约束, 你要么循环索引, 要么循环元素。这导致了 enumerate() 函数的推出(Python2.3 新增)。例如:
for i, ch in enumerate(foo):
... print ch, '(%d)' % i
...
a (0)
b (1) c (2)
列表解析
>>> squared = [x ** 2 for x in range(4)] >>> for i in squared:
... print i
0
1
4
9
列表解析甚至能做更复杂的事情:
>>> sqdEvens = [x ** 2 for x in range(8) if not x % 2]
>>>
>>> for i in sqdEvens:
... print i
0
4
16
36
文件和内建函数open()、file()
如何打开文件
handle = open(file_name, access_mode = 'r')
file_name
变量包含我们希望打开的文件的字符串名字,access_mode
中 'r'
表示读取, 'w'
表示写入, 'a'
表示添加。其它可能用到的标声还有 '+'
表示读写, 'b'
表示二进制访问. 如果未提供 access_mode
, 默认值为 'r'
。如果 open()
成功, 一个文件对象句柄会被返回。所有后续的文件操作都必须通过此文件句柄进行。当一个文件对象返回之后, 我们就可以访问它的一些方法, 比如 readlines()
和 close()
.文件对象的方法属性也必须通过句点属性标识法访问。
print 语句中使用逗号来抑制自动生成的换行符号。
错误和异常
可以给代码添加错误检测及异常处理, 只要将它们封装在 try-except 语句当中。 try之后的代码组, 就是你打算管理的代码。 except 之后的代码组, 则是你处理错误的代码。
通过使用 raise 语句故意引发一个异常。
函数
类似其它的语言, Python 中的函数使用小括号( () )
调用。函数在调用之前必须先定义。 如果函数中没有 return 语句, 就会自动返回 None 对象。
Python 是通过引用调用的。 这意味着函数内对参数的改变会影响到原始对象。不过事实上只有可变对象会受此影响, 对不可变对象来说, 它的行为类似按值调用。
如何定义函数
def function_name([arguments]):
"optional documentation string"
function_suite
默认参数
函数的参数可以有一个默认值, 如果提供有默认值,在函数定义中, 参数以赋值语句的形式提供。事实上这仅仅是提供默认参数的语法,它表示函数调用时如果没有提供这个参数,它就取这个值做为默认值。
类
类是面向对象编程的核心, 它扮演相关数据及逻辑的容器角色。它们提供了创建“真实”对象(也就是实例)的蓝图。
如何定义类
class ClassName(base_class[es]):
"optional documentation string"
static_member_declarations
method_declarations
使用 class 关键字定义类。可以提供一个可选的父类或者说基类; 如果没有合适的基类,
那就使用 object 作为基类。class 行之后是可选的文档字符串, 静态成员定义, 及方法定义。
模块
模块是一种组织形式, 它将彼此有关系的 Python 代码组织到一个个独立文件当中。模块可以包含可执行代码, 函数和类或者这些东西的组合。
如何导入模块
import module_name 如何访问一个模块函数或访问一个模块变量
一旦导入完成, 一个模块的属性(函数和变量)可以通过熟悉的 .句点属性标识法访问。
实用的函数
函数 | 描述 |
---|---|
dir([obj]) | 显示对象的属性,如果没有提供参数, 则显示全局变量的名字 |
help([obj]) | 以一种整齐美观的形式显示对象的文档字符串, 如果没有提供任何参数, 则会进入交互式帮助。 |
int(obj) | 将一个对象转换为整数 |
len(obj) | 返回对象的长度 |
open(fn, mode) | 以 mode(‘r’ = 读, ‘w’= 写)方式打开一个文件名为 fn 的文件 |
range([[start,]stop[,step]) | 返回一个整数列表。起始值为 start, 结束值为 stop - 1; start 默认值为 0, step默认值为1。 |
raw_input(str) | 等待用户输入一个字符串, 可以提供一个可选的参数 str 用作示提信息。 |
str(obj) | 将一个对象转换为字符串 |
type(obj) | 返回对象的类型(返回值本身是一个 type 对象!) |
Python基础
语句和语法
- 井号(#)表示之后的字符为 Python 注释
- 换行 (\n) 是标准的行分隔符(通常一个语句一行)
- 反斜线 ( \ ) 继续上一行
- 分号 ( ; )将两个语句连接在一行中
- 冒号 ( : ) 将代码块的头和体分开
- 语句(代码块)用缩进块的方式体现
- 不同的缩进深度分隔不同的代码块
- Python文件以模块的形式组织
注释( # )
Python 注释语句从 # 字符开始,注释可以在一行 的任何地方开始,解释器会忽略掉该行 # 之后的所有内容。
继续( \ )
Python 语句,一般使用换行分隔,也就是说一行一个语句。一行过长的语句可以使用反斜 杠( \ ) 分解成几行。
有两种例外情况一个语句不使用反斜线也可以跨行。在使用闭合操作符时,单一语句可以跨多行,例如:在含有小括号、中括号、花括号时可以多行书写。另外就是三引号包括下的字
符串也可以跨行书写。
多个语句构成代码组(:):
缩进相同的一组语句构成一个代码块,我们称之代码组。
模块
变量赋值
- 赋值运算符
- 链式赋值 y = x = x + 1
- 增量赋值 x += 1
- 多重赋值 x = y = z = 1
“多元”赋值
另一种将多个变量同时赋值的方法我们称为多元赋值(multuple)。
x, y, z = 1, 2, 'a string'
标识符
标识符是电脑语言中允许作为名字的有效字符串集合。
Python 还有称为 built-in 标识符集合,虽然它们不是保留字,但是不推荐使用这些特别 的名字。
合法的 Python 标识符
- 第一个字符必须是字母或下划线(_)
- 剩下的字符可以是字母和数字或下划线
- 大小写敏感
关键字
内建
专用下划线标识符
_xxx
不用'from module import *'
导入__xxx__
系统定义名字__xxx
类中的私有变量名
模块结构和布局
- 起始行(Unix)
- 模块文档
- 模块导入
- 变量定义
- 类定义
- 函数定义
- 主程序
内存管理
- 变量无须事先声明
- 变量无须指定类型
- 程序员不用关心内存管理
- 变量名会被“回收”
- del 语句能够直接释放资源
变量定义
动态类型
内存分配
引用计数
一个内部跟踪变量,称为一个引用计数器。至于每个对象各有多少个引用, 简称引用计数。当 对象被创建时, 就创建了一个引用计数, 当这个对象不再需要时, 也就是说, 这个对象的引用计数变为 0 时, 它被垃圾回收。
备注:引用计数还有一个致命的缺陷,当程中出现序循环引用时,引用计数算法无法检测出来,被循环引用的内存对象就成了无法回收的内存。从而引起内存泄露。
增加引用计数
- 对象被创建
- 或另外的别名被创建
- 或被作为参数传递给函数(新的本地引用)
- 或成为容器对象的一个元素
减少引用计数
当对象的引用被销毁时,引用计数会减小。最明显的例子就是当引用离开其作用范围时, 这种情况最经常出现在函数运行结束时,所有局部变量都被自动销毁,对象的引用计数也就随之减少。
- 一个本地引用离开了其作用范围。
- 对象的别名被显式的销毁。
del y # or del x
- 对象的一个别名被赋值给其它的对象。
x = 123
- 对象被从一个窗口对象中移除。
myList.remove(x)
- 窗口对象本身被销毁。
del myList
垃圾收集
不再被使用的内存会被一种称为垃圾收集的机制释放。一个循环引用发生在当你有至少两个对象互相引用时, 也就是说所有的引用都消失时, 这些引用仍然存在, 这说明只靠引用计数是不够的。Python的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器。 当一个对象的引用计数变为 0,解释器会暂停,释放掉这个对象 和仅有这个对象可访问(可到达)的其它对象。作为引用计数的补充, 垃圾收集器也会留心被 分配的总量很大(及未通过引用计数销毁的那些)的对象。
参考资料:
Python核心编程
备注:
转载请注明出处:http://blog.youkuaiyun.com/wsyw126/article/details/53573644
作者:WSYW126