【摘要】Python作为一门很简洁的语言,在编程界也占有一席之地,在学完了C++之后,适当的学习一些Python的常见语法也是很不错的,现在我就把最近学到的Python的知识点总结在下面,可能有些多,你们可以慢慢看,这个主要还是要多练习呢
printf函数将结果输出到标准输出
raw_input = 函数从标准输入中获取用户输入
name = raw_input("Enter name:")
raw_input 返回的结果只是一个字符串,如果需要获得一个数字,需要使用int函数把字符串转化为数字
操作符
列表,元组,字典
- 可以存放任意类型的数据,可以进行切片操作,列表中元素可以修改,但是元组中不行
- 字典是典型的KV模型
- 字符串,使用三引号可以实现大部分转义,但是还有少部分需要自己去转义
- ‘+’用于字符串的连接,‘*’用于字符串的重复
- 字符串可以进行切片操作
- type(a)可以查看元素类型
- *表示乘方运算 100**100表示100的100次方
- python比较大小得到的是一个bool值
- 字符串之间比较大小的结果取决于字符串的”字典序“
- 列表中的元素可以修改,但是元组中的元素不可以修改
- 如果定义两个变量都是100,那么他们的地址是一样的,这样相当于引用
- python中使用缩进来表示代码块
- if elif相当于else if
- 判断循环都不需要括号
- for 循环可以遍历的有很多种形式
- 内建函数range能够生成一个数字组成的列表,方便进行for循环遍历
- pass语句负责空语句,这是因为在python中是通过缩进来判断代码块的,不然会产生混乱
squared = [x ** 2 for x in range(4)]
print squared 生成[0,4]的平方序列
evens = [x for x in range(0,8)if x%2 == 1] 获取(0,8)区间中的所有奇数
- python中没有重载的概念,相同名字的函数,后面的会覆盖前面的
- python支持默认参数,函数的参数具备默认值
- python解包语法(unpack),函数返回多个值
- _,y 作为占位符
- 函数也是对象,一个函数和一个数字,字符串一样,都可以定义别名来引用它
文件操作
handle = open(file_name,access_mode = 'r')
handle是一个文件句柄,是一个可迭代的对象,可以直接使用for循环按行读取文件内容,handle使用完毕,需要close掉,否则会引起资源泄露(一个进程可以打开的句柄数目是有限的)
模块
当我们一个项目的代码量较大时,需要把代码放到多个不同的.py文件中
- 通过import关键字,引用其他.py文件中的代码
- 被引用的这个代码文件,就称之为”模块“
- 被引用的文件,去掉.py后缀名,就是模块名
- 模块查找的顺序,先查找哦当前目录,然后查找python的安装目录
python基础语法
语句和变量
- 单引号和双引号都不能折行,但是三引号可以
- 缩进规范:同一个语句块中的代码必须保证严格的左对齐(左边有同样数目的空格和制表符)
- 多重赋值:可以同时给多个变量赋相同的值,也可以给多个变量赋不同的值
x,y = 1,2
交换数据
x,y =10,20
x,y = y,x
作用域和生命周期
- python中,def,class,lamda会改变变量的作用域
- if,else,elif,while,for,try/catch不会改变变量的作用域
- 内建函数globals()返回了全局作用域下都有哪些变量,内建函数locals()返回了局部作用域下都有哪些变量
- python的变量的生命周期,python提供了垃圾回收机制自动识别一个变量的生命周期是否走到尽头,并自动释放空间
特殊标识符
- python使用下划线(_)作为便来给你的前缀和后缀,来表示特殊的标识符
- _xxx表示一个‘私有变量’,使用 from module import *无法导入
- xxx(恰后一个下划线) xxx(前后两个下划线)一般是系统定义的名字,我们自己定义变量时要避开这种风格,防止和系统变量发生冲突
文档字符串
- 用#来表示单行注释
- 对于多行注释,我们可以使用三引号,这东西也被称为文档字符串
- 使用对象的doc属性就可以看到这个帮助文档了(print Add.doc)
- 使用内建函数help也可以做到同样的效果
- 文档字符串一定要放在函数/类的开始位置,否则就无法使用doc或者help来访问了
理解对象和类型
- 有些对象时相似的,于是我们把对象归类
- 相同类型的对象,须有相同的操作
- 动态是指在运行时进行变量类型检查,强类型指类型检查严格,并且偏向于不允许隐式转换
- print type(a) == types.IntType
- print isinstance(a,type(100))
python不支持的类型
- char byte:可以使用长度为1的字符串代替,或者整数代替
- 指针:python替你管理内存,虽然id()返回的值接近于指针的地址,但是并不能主动去修改
- int/short/long:python中正实数表示的范围,只取决于机器内存的大小
- divmod :返回一个元组,同时计算商和余数
- str :将数字转化为字符串
- round:对浮点数进行四舍五入,round有两个参数,第一个是要运算的值,第二个是保留小数点后多少位
- 整数进制转化:oct(),hex()参数是一个整数,返回值是对应字面值的字符串
- math/cmath模块:提供一些方便的数字运算的函数,math是常规数字运算,camath是复数运算
条件表达式
smaller = x if x < y else y
函数和可调用对象
- 函数的定义知识创建了一个函数,并没有执行函数体中的代码,要在真正进行函数调用时,才执行函数体中的代码
- 函数的定义也可以放在其他函数内部,但是这样函数的作用域也就只是在函数内部才有效
- python时动态类型语言,在你写下代码的时候,解释器并不知道参数的类型是什么,而是在运行时函数才知道了类型
- 定义函数时, ⽀持给函数指定默认参数. 这样如果调⽤函数时不显式的指定参数, 就会使⽤默认参数作为参数值
- 默认参数是非常有用的,尤其是在一些库的接口,可能需要传入很多的参数,那么默认参数就可以帮我们减轻许多负担
- 对于多个默认参数的函数,可以按照顺序给函数的某几何参数进行传参
关键字参数
- 当我们有多个默认参数,同时只想传其中的某几个的时候,还可以使用关键字参数的方式进行传参,例如内建函数sorted(用来给序列进行排序),函数原型是
sorted(iterable[,cmp[,key[,reverse]]])
函数有四个参数,第一个参数表实传入一个可迭代的对象(列表,字符串,字典),生于三个参数都具备默认参数,可以不传
按元素的绝对值排序
def Cmp(x, y):
if abs(x) < abs(y):
return -1
elif abs(x) > abs(y):
return 1
else:
return 0
a = [1, -3, 4, 2]
print sorted(a, cmp = Cmp)
按字符串的长度排序
a = ['aaaa', 'bbb', 'cc', 'd']
print sorted(a, key = len)
参数组
我们还可以将⼀个元组或者字典, 作为参数组, 来传给函数. 这样就可以帮助我们实现 "可变⻓参数"
通过将参数名前加⼀个 * 号, * 之后的内容表示是⼀个元组.
使⽤ \t 分割的⾏⽂本, 可以很⽅便的和linux上的⼀些⽂本处理⼯具搭配使⽤. ⽐如cut, sort, awk等.
通过在参数名前加两个星号 **, 星号后⾯的部分表示传⼊的参数是⼀个字典. 这时候调⽤函数就可
以按照关键字参数的⽅式传参了
- Python的变量类型是在运⾏时检查的, 同⼀个函数, 就已经可以处理不同类型的参数了.
- 通过参数组和默认参数, 解决处理不同数⽬的参数的能⼒.
- 通过关键字参数, 也极⼤的加强了传参的灵活性, ⽽不⽐像C++那样只能按顺序传参.
函数的返回值
- 通过return1返回一个对象
- 如果没有return语句,则返回的是None对象
- 可以同时返回N个对象,通过分割(本质上是返回一个元组)
- 函数也是一个对象,通过内建函数dir可以看到一个函数中都有哪些属性
- 因为函数是一个对象,因此函数也可以作为其他函数的参数
python序列和字典
- 序列:包含若干个元素,元素有序排列,可以通过下标访问到一个或多个元素,这样的对象,Python中统一称为序列
- 字符串,列表,元组都属于序列
序列类型操作符
- in/not in:判定一个元素是否存在于序列中,返回布尔值
- 连接操作符(+):把两个相同类型的序列进行连接
- 连接操作符往往并不高效(新创建对象,把原有对象拷贝进去),对于列表,推荐使用extend来完成这样的操作,对于字符串,推荐使用join这样的方法
反转字符串
a = "adsafsf"
print a[::-1]
len max min sorted
enumerate:同时枚举出序列的下标和值
def Find(input_list, x):
for i in range(0, len(input_list)):
if input_list[i] == x:
return i
else:
return None
- zip函数可以理解为矩阵的行列互换
- dict 构造一个字典
- 当我们不想要转义时,可以使用1原始字符串,在字符串字面值前加上t或者R前缀,表示原始字符串
- repr 和str都可以将对象转换成字符串
- repr转换出来的字符串,是给Python解释器看的,得到的是一个Python语句,可以直接放到解释器里面执行
- join,将序列中的字符串合并成一个字符串
//按空格将字符串分割成列表
a = 'aa bb cc dd'
print a.split(' ')
a = 'hello world'
print a.startswith('hello')
print a.endswith('world')
a = ' hello world'
print a.strip()
a = 'hello world'
print '[' + a.ljust(30) + ']'
print '[' + a.rjust(30) + ']'
print '[' + a.center(30) + ']'
a = 'hello world'
print a.find('world')
a = 'hello world'
print a.replace('world', 'python')
a = 'hello world'
print a.isalpha()
a = '1234'
print a.isdigit()
a = 'Hello World'
print a.lower()
print a.upper()
列表
- 列表的切片操作和字符串完全一致
- 列表可以使用切片操作修改元素
- append:追加元素,del:删除指定下标元素,按值删除元素:remove,extend:列表连接
- sort默认使用归并排序的衍生算法,时间复杂度是O(N*logN)
- 基于列表的堆栈和基于列表的队列
- 列表的赋值(=), 切⽚操作([:]), list⼯⼚函数, 都是在进⾏浅拷⻉.
- 浅拷⻉是指, 虽然我重新创建了⼀个新对象, 但是新对象⾥⾯包含的⼦对象, 和原来的⼦对象是同⼀
个对象.
- 相对应的, 深拷⻉就是指, 重新创建了⼀个新对象, 同时这个新对象的⼦对象, 也都是重新创建了⼀
份新的深拷⻉对象.
- 深拷⻉通过 copy.deepcopy 来完成
- 如果元组中的某个元素,是可变对象(列表或字典),那么仍然是可以修改的
创建字典
- 使用{},使用工厂方法dict,使用内建函数fromkeys
修改字典元素
- 使用[]可以新增/修改字典元素,如果key不存在,就会新增,如果已经存在,就会修改
- 使用clear方法,清空整个字典中的所有的键值对
- 使用pop函数,删除键值对,同时获取到值
- hash 判断一个对象是否可hash,如果可hash,返回hash之后的hashnode
集合(set)
- 集合数据结构实现了很多数学中的交集,并集,差集等方法
a = set([1,2,3])
b = set([1,2,3,4])
print a & b
print a | b
print b - a
print a ^ b
数据去重
a = [1,2,1,2,3,4,4]
b = set(a)
print b