python中有4种数——整数、长整数、浮点数、复数
整数 2
长整数 比整数大的整数
浮点数 3.23 52.3E-4
复数 -5+4j 2.3-4.6j

字符串

使用单引号(’)
你可以用单引号指示字符串,就如同’Quote me on this’这样。所有的空白,即空格和制
表符都照原样保留。

  • 使用双引号(”)
    在双引号中的字符串与单引号中的字符串的使用完全相同,例如”What’s your name?”。
  • 使用三引号(’’’或”””)
    利用三引号,你可以指示一个多行的字符串。你可以在三引号中自由的使用单引号和双
    引号。例如:
    ‘’’This is a multi-line string. This is the first line.
    This is the second line.
    “What’s your name?,” I asked.
    He said “Bond, James Bond.”
    ‘’’

转义符

在字符串中包含‘,

  1. 用\’,eg what’s your name ——> ‘what\’s your name’
  2. ”what’s your name”
    在双引号中表示双引号,也需要反斜杠\”
    表示反斜杠本身,则\\
    字符串行末单独的一个反斜杠表示字符串在下一行继续,而不是新的一行
    “abcd\
    efgh.”
    等价于 “abcdefgh.”

自然字符串

要指示某些不需要如转义符那样的特别处理的字符串,则要指定一个自然字符串
通过给字符串加上前缀r或R来指定
r”abcdefgh\n”

Unicode字符串

在字符串前加上前缀u或U 如u“abcdefg”

字符串是不可变的

一旦创造了一个字符串就不能再改变它了

按字面意义级连字符串

把两个字符串按字面意义相邻放着,会被python自动级连
‘what\’s’’your name?’ 会被自动转为”what’s your name”

注释

  • python没有char数据类型
  • 单引号和双引号完全相同
  • 对正则表达式:一定要用自然字符串处理正则表达式,否则会需要很多反斜杠。如后向引用符可写成’\\1’或r’\1’

变量

标识符的命名

  • 第一个字符必须是字母表中的字母(大写或小写)或下划线_
  • 标识符名称其他部分可以由字母(大写或小写)、下划线_或数字组成
  • 标识符名称对大小写敏感

对象

python把程序中用到的任何东西都称为对象
使用变量时是需要给它赋一个值,不需要声明或定义数据类型

逻辑行与物理行

物理行就是在编写程序时所看见的
逻辑行是python看见的单个语句。python假定每个物理行对应一个逻辑行
python默认希望每行只使用一个语句

  • 在一个物理行使用多于一个逻辑行,则需要使用分号;(不建议)
  • 在多个物理行写一个逻辑行,明确的行连接
    print \
    i
    等价于 print i
    另有暗示的行连接

缩进

错误的缩进会引发错误
不要混合使用制表符和空格缩进
建议每个缩进层次使用单个制表符或者两个或四个空格

运算符与表达式

大多数语句包含表达式
表达式可分解为运算符和操作数

and和or存在短路计算

运算符优先级

运算符通常由左向右结合,即具有相同优先级的运算符按照从左向右顺序计算
一些运算符如赋值运算符则由右向左结合,即a=b=c被处理为a=(b=c)

控制流

if

1
2
3
4
5
6
if 条件1:
xxxx
elif 条件2:
xxxx
else:
xxxx

(python中没有switch语句)

for

eg.

1
2
3
4
5
for i in range(m,n):
xxxx
else:
xxxx
()

上述例子用了内建的range函数
提供两个数,range返回一个序列的数,该序列从第一个数开始到第二个数为止
如range(1,5)给出序列[1, 2, 3, 4]
默认步长为1

如果给range提供第三个数,则该数成为步长
如range(1,5,2)给出[1, 3]
(range的参数均为integer整数,从小到大)
range向上延伸到第二个数,即它不包含第二个数

else部分是可选的
如果包含else,则总是在for循环结束后执行一次,除非遇到break
(即若遇到break则直接退出for循环,并且不会执行else语句)

while

1
2
3
4
while 条件为真:
xxxx
else:
xxxx

while语句有一个可选的else从句(其实是多余的)

break

break语句是用来终止循环语句的,即哪怕循环条件没有称为False或序列还没有被完全递归,
也停止执行循环语句
如果从for或while中终止,任何对应的循环else块将不执行

continue

continue语句被用来告诉Python跳过当前循环块中的剩余语句,然后继续进行下一轮循环。

函数

函数通过def关键字定义

1
2
def functionnamea, b, c, ...):
funciton body

调用函数 functionname(x1, x2, x3, …)

函数形参

参数在函数定义的圆括号对内指定,用逗号分割。

局部变量

在函数定义内声明的变量即为局部变量
所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开始

global语句

为一个定义在函数外的变量赋值,用global告诉python这个变量名是全局的
可以使用定义在函数外的变量的值(假设函数内没有同名的变量),但不鼓励

eg(python3).
可以用一个global语句指定多个全局变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/python
# Filename: test.py
def func():
global x
print ('x is')
print (x)
x = 2
print ('changed local x to')
print (x)

x = 50
func()
print ('value of x is')
print (x)

输出

1
2
3
4
5
6
x is
50
changed local x to
2
value of x is
2

默认参数值

对一些函数,希望它的参数是可选的。如果用户不想为这些参数提供值则这些参数使用默认值。
在函数定义的形参名后加上赋值运算符=和默认值,从而给形参指定默认参数值
应该最后声明有默认值的形参(因为赋给形参的值是根据位置而赋值的)

关键参数

函数有许多参数,可以通过命名来为一部分参数赋值,即关键参数
使用名字(关键字)而不是位置来给函数指定实参
优势:

  1. 不必担心参数的顺序
  2. 假设其他参数都有默认值,可以只给我们想要的那些参数赋值

return语句

return语句用来从一个函数返回,即跳出函数。也可选从函数返回一个值
没有return等价于return None

Docstrings

文档字符串
在函数的第一个逻辑行的字符串是这个函数的文档字符串
惯例:
一个多行字符串,首行以大写字母开始,句号结尾,第二行是空行,第三行开始详细的描述

可以使用function.__doc__(双下划线)调用函数的文档字符串属性
help()所做的就是抓取函数的__doc__属性并展示

模块

想在其他程序中重用很多函数,则可以使用模块
模块基本上是一个包含了所有定义的函数和变量的文件,模块的文件名必须以.py为扩展名(为了在其他程序中重用模块)
使用模块: import 模块名
使用变量: 模块名.变量名

字节编译的.pyc文件

使输入模块更快

from … import

from sys import argv 直接输入argv变量到程序中
from sys import* 输入所有sys模块使用的名字

模块的__name__

每个模块都有一个名称,模块中可以通过语句找出模块的名称
应用场景:只想在程序本身被使用时运行主块,而在它被别的模块输入的时候不运行主块

1
if __name__ == '__main__'

  • 如果模块的__name__是‘__main__‘,则说明这个模块被用户单独运行

制造自己的模块

每个python文件就是一个模块,确保其拓展名为.py
注意import和from … import在使用模块上的不同

dir函数

可以使用内建的dir函数列出模块定义的标识符。标识符有函数、类和变量

  • 为dir提供一个模块名,它返回模块定义的名称列表
  • 不提供参数,返回当前模块定义的名称列表

数据结构

python中有三种内建的数据结构

  1. 列表
  2. 元组
  3. 字典

列表list

每个项目之间用逗号分割
列表的项目包括在方括号内
可以添加、删除、搜索列表中的项目(列表是可变的数据类型)

对象与类

列表是使用对象和类的一个例子
当使用变量 i 并给它赋值时,可以认为创建了一个类(类型)int的对象(实例)i。

类有方法,即仅仅为类而定义的函数。仅在你有一个该类的对象的时候,才可以使用这些功能
python为list类提供了append方法,这个方法可以在列表尾添加一个项目
如:mylist.append('an item')
类有域,它是仅仅为类定义的变量
仅在有一个该类的对象时才能使用这些变量/名称,如mylist.field

使用列表

定义一个列表
shoplist = ['apple', 'mango', 'carrot', 'banana']
获得列表元素个数
len(shoplist)
打印列表
print shoplist
使用for … in 在列表中各项目间递归(列表也是一个序列)
``

元组

不能修改元组
元组通过圆括号中用逗号分隔的项目定义
只含有一个元素的元组:需要在单个项目后面跟一个阔后,从而区分元组和表达式中一个带圆括号的对象
singleton = (2,)

元组与打印语句

print语句可以使用跟着%符号的项目元组的字符串
%后有多个项目时需要加圆括号(元组形式)
%后只有单个项目时不需要圆括号

字典

把键和值联系在一起
键必须是唯一的
只能使用不可变的对象(如字符串)来作为字典的键
可以把不可变或可变的对象作为字典的值
eg.
d = {key1 : value1, key2 : value2 }
字典中的键/值没有顺序
字典是dict类的实例/对象

序列

列表、元组和字符串都是序列
序列的两个特点:

  1. 索引操作符 从序列中抓取一个特定项目
  2. 切片操作符 获取序列的切片,即一部分序列

索引可以是负数,位置从序列尾开始计算,最后一个元素下标为-1
切片操作符是序列名后跟一个方括号,方括号内有一对可选的数字,冒号分割(数可选,冒号必须)
切片操作符中的第一个数表示切片开始的位置,第二个表示在哪里结束
不指定第一个数则从序列首开始
不指定第二个数则停止在序列尾
开始位置包含在序列切片内,结束位置排斥在切片外

可以用相同方法访问元组、列表、字符串

引用

创建一个对象并给它赋一个变量时,这个变量仅仅引用那个对象,并不是表示对象本身
即变量名指向计算机存储那个对象的内存,这称作名称到对象的绑定

即需要注意:

  • 要复制一个序列或其他对象,必须使用切片操作符来拷贝(获得两份独立的序列)
  • 直接使用赋值时,两个名称都引用一个对象,即两个名称都指向一个唯一的序列(赋值不创建拷贝)

其他字符串内容

在程序内使用的字符串都是str类的对象

字符串的方法

测试字符串是否以给定字符串开始
stringname.startswith('xxxx')

检验给定字符串是否为另一个字符串的一部分
if 'xxx' in stringname

找出给定字符串在另一个字串中的位置(首字母下标),找不到返回-1
stringname.find('xxx')

str类有以一个作为分隔符的字符串join序列的项目的整洁的方法,返回一个生成的大字符串

1
2
3
delimiter = '_*_'
mylist = ['a','b','c','d']
delimiter.join(mylist)