Python常用语法(上)

【摘要】Python作为一门很简洁的语言,在编程界也占有一席之地,在学完了C++之后,适当的学习一些Python的常见语法也是很不错的,现在我就把最近学到的Python的知识点总结在下面,可能有些多,你们可以慢慢看,这个主要还是要多练习呢

printf函数将结果输出到标准输出
raw_input = 函数从标准输入中获取用户输入
name = raw_input("Enter name:")
raw_input 返回的结果只是一个字符串,如果需要获得一个数字,需要使用int函数把字符串转化为数字

操作符
  • ‘/’是传统除法,如果两个整数相除,结果仍然是整数,如果其中一个数是浮点数,那么得到的结果也是浮点数
  • ‘//’地板除是将结果中的小数舍弃

  • from__future__import division 精确除法

  • **乘方运算
  • Python的大小比较得到的是一个bool值
  • 字符串之间的比较取决于字典序

列表,元组,字典

  • 可以存放任意类型的数据,可以进行切片操作,列表中元素可以修改,但是元组中不行
  • 字典是典型的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] 获取(08)区间中的所有奇数
  • python中没有重载的概念,相同名字的函数,后面的会覆盖前面的
  • python支持默认参数,函数的参数具备默认值
  • python解包语法(unpack),函数返回多个值
  • _,y 作为占位符
  • 函数也是对象,一个函数和一个数字,字符串一样,都可以定义别名来引用它
文件操作
handle = open(file_name,access_mode = 'r') //file_name可以是一个绝对路径也可以说是一个相对路径
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

你可能感兴趣的:(Python)