基础语法
编译和解释
编译和解释是程序执行的两种方式:
源代码:采用某种编程语言,人类可读
目标代码:计算机可直接执行,人类不可读
编译:源代码经过编译器一次性转换成目标代码的过程
解释:将源代码逐条转换成目标代码,同时逐条运行的过程,通过解释器
二者区别:编译一次性翻译文档翻译,解释类似于同声传译
1)静态语言使用编译执行的C和java
2)脚本语言php和python则是解释性语言
python变量和参数传递
a='STR'
b=a
print("b=",b,"id(b)=",id(b),"a=",a,"id(a)=",id(a))
a='FSESAF'
print("b=",b,"id(b)=",id(b),"a=",a,"id(a)=",id(a))
结果:
b= STR id(b)= 2855286173456 a= STR id(a)= 2855286173456
b= STR id(b)= 2855286173456 a= FSESAF id(a)= 2855286260880
a=[1,2,3,4,5]
b=a
print(b,id(b),a,id(a))
a.append(2)
print("b=",b,"id(b)=",id(b),"a=",a,"id(a)=",id(a))
结果:
b= [1, 2, 3, 4, 5] id(b)= 2855301964104 a= [1, 2, 3, 4, 5] id(a)= 2855301964104
b= [1, 2, 3, 4, 5, 2] id(b)= 2855301964104 a= [1, 2, 3, 4, 5, 2] id(a)= 2855301964104
对象分类 | 概念 | 包括 |
---|---|---|
可变对象 | 因为可变类型变量特性,直接在原对象上修改,因为此时形参和实参都是指向同一个对象,所以实参指向的对象自然就被修改了 | list, dict, set |
不可变对象 | 对象创建后对象的内容是不可以改变的,在函数中只要产生了新对象,内存引用地址都会发生改变 | bool, int, float, tuple, str, frozens |
所以不可变对象修改内容,会创建新对象,可变对象则形参和实参都会改变
(a=a.append(2),会返回空值,因为,append这个操作是没有返回值的,即返回一个None)
异常处理
作用:异常机制可以使程序中的异常处理代码和正常业务代码分离,保证程序更加优雅,提升健壮性。
何时使用:异常情况无法穷举时,错误处理代码和业务实现代码混杂时,需要强大的机制进行异常处理
基本使用方法:
try:用来捕获异常,会触发异常的语句放到try后
except:后面接发生异常后需要执行的操作
①可以打印异常信息except Exception as error
②如果想捕获特定的异常 except XXX as error,其他异常会中断程序运行,用于发现未知异常
else:没有异常会执行else
finally:有无异常都会执行
except后面可以接多个异常
a=[1,3,4,5,0,'张',0]
for i in a:
try:
print(5/i)
except (ZeroDivisionError,TypeError) as error:
print('错误信息为{0}'.format(error))
continue
else:
print('没有异常')
打印出现异常的行
traceback.print_exc()
输出结果是
Traceback (most recent call last):File "test_traceback.py", line 3, in <module>1/0ZeroDivisionError: integer division or modulo by zero
这样非常直观有利于调试。
模块和包
导入某个模块,执行时,该模块测试代码也会被调用
使用if name==‘main’:
只有当__name__属性是’main’时(在本模块调用时)才会调用测试函数,所以在调用函数前使用该方法
def wan(a,b):
print(a+b)
if __name__=='__main__':
print(wan(2,4))
模块导入
两种方式:
import test1 as 别名 --直接导入模块名,包含所有功能,调用功能需要模块.功能名
print(test1.wan(2,3))
from test1 import wan as 别名 --从模块导入特定功能,调用不需要写模块名
print(wan(2,3))
包
导入自建包需要设置为Sources Root
两种方法
import zhang.test2
zhang.test2.name(20,30)
有时候不希望每个成员都暴露出来,借用__all__变量,将变量设置成一个列表,只有列表中程序单元会暴露
#__init__.py需要引入all变量
__all__=['test2']
from zhang.test2 import name
name(20,30)
控制警告信息,过滤部分无意义警告
import warnings
warnings.filterwarnings('ignore')
基本语法
print
print函数默认隐藏end=‘\n’换行,如果不想换行设置为end=‘\t’
print函数默认隐藏sep=‘ ’,表示多个对象的分隔符号,修改为sep=‘+++’则替换为+++
print加号实现对象连接,*实现对象的复制
print中\和很多字母都是转义字符,所以可以在对象前面加上r解决这种问题
print输出多个变量,采用.format方法
数学运算符
除法、取余、取整、指数
逻辑运算符
and运算符,只要有一个值为0,则结果为0,否则结果为最后一个非0数字。
or运算符,只有所有值为0结果为0,否则结果为第一个非0数字。
0代表假,1代表真
字符串
使用三引号可以换行‘’‘ ’‘’
切片a[开始位置下标:结束位置下标:步长],可以省略对应的参数
字符串查找、修改和判断
查找使用变量名.find(‘expr’,start,end),限定范围查找字符,后面范围可以省略,错误返回-1
也可以使用index(‘expr’,start,end),区别就是错误直接报错
查找数据出现的次数变量.count(‘expr’,start,end)
字符串替换函数变量.replace(‘原来’,‘替换对象’,N),n代表替换的次数
分割函数变量名.split(‘标识符’,N),最终输出列表list
字符串连接,使用‘连接符号’.join(变量名)
列表
查
使用index查询列表中元素位置,使用count统计元素数量,使用len()统计元素数量
增
append会在末尾增加一个元素,extend可以在末尾增加多个元素,inser(下标、数据)在任意位置插入
列表中可以插入列表,通过a[n][m]查找数据
删
三种方法
①del 变量名[] 删除某个位置字段
②变量名.pop(N),删除后,返回被删除的字段
③变量名.remove(‘模糊字符’)删除第一个匹配的元素
改
三种方法
①直接变量名[n] 重新赋值
②变量名.reverse()列表整个倒序
③列表重新进行排序变量名.sort() 降序为sort.(reverse=True)
④列表复制变量名.copy()
copy会生成新的地址
序列封包和拆包
序列:指的是包含多项数据的数据结构,序列的多个数据项按顺序排列,通过索引来访问成员
序列封包:将多个值封装成元组
序列解包:将序列直接赋值给多个变量,需要保证元素数量和变量个数相等
条件语句
三目运算 先执行if true 返回前面的,false返回后面的
字典与集合
字典dict():增删
clear()会清空字典
字典:查
也可以使用字典.get()方法,没有查到自定义返回值
字典.items()则返回元组
字典数据的遍历
集合set()特点
集合不可修改,自动对数据进行去重,不支持下标
集合增加数据,方法两种.add (单个元素) .update(序列) 序列为列表字符元组
集合删除数据
不存在这个数据remove会报错,discard则不会
使用in判断是否存在该元素
元组列表字典字符串集合总结
有序序列:可以进行下标和切片操作,如字符串、列表、元组
无序序列:如集合和字典
可变序列:元素可以进行增删查改,不生成新的id地址例如字典列表集合
不可变序列:修改后生成新的id地址,例如字符串元组整型浮点型
1、字符串:不能修改的字符序列。除了不能修改,可把字符串当成列表一样处理。
2、列表:我觉得列表就是我们日常生活中经常见到的清单。比如,统计过去一周我们买过的东西,把这些东西列出来,就是清单。由于我们买一种东西可能不止一次,所以清单中是允许有重复项的。
3、元组:用来存放不能被轻易修改的数据,例如身份证号
4、字典:是除列表外python中最灵活的内置数据结构类型。列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
5、集合:目的就是去重复。
for循环
break和continue
break会直接跳出for循环,continue则会跳过本次,继续下一次
for+else组合,属于for循环中,执行完跳到else
enumerate,返回序列的索引和数据
推导式,使代码化简,for,if组合
列表推导式生成偶数
生成符合后缀要求的列表
list=[i for i in os.listdir('/data/sdc/data_2016_2017/') if i.endwith('.csc')]
#str.endwith(str) endwith常用来判断文件类型
两个列表形成字典
提取字典中的数据
while循环
函数
函数说明文档,在def下面用三个引号添加解释说明,使用help打印
静态参数:可以直接形参带上实参就可以不考虑顺序
可变参数:*args和**knargs
示例待定
return列表、元组、字典接收一个参数就是整体返回,同等数量的实参就是所有值逐一返回拆包
lambda匿名函数
函数格式为:lambda 形参:表达式
没有形参
def name():
return 630
等价于(lambda:630)()
一个参数
def name(a):
return a
等价于(lambda x:x)(520)
两个参数
def(a,b):
return a+b
等价于(lambda a,b:a+b)()
高阶函数
就是以函数作为参数,返回也是函数,传入abs取绝对值函数
外置高阶函数:
内置高阶函数:
①filter(函数名,可迭代对象) 作用:过滤序列中不符合条件的元素
函数名为None,将为true的筛选出来
函数名不为空,会将序列中每个元素进行计算
②map(函数名,可迭代对象) 作用:对可迭代对象中每个元素进行函数计算
③reduce(函数(x,y),可迭代对象)
上一个计算结果和下一个元素按照函数规则计算
1/2/3/4=1/24
编码格式
open文件时默认为utf-8编码格式
import _locale
_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])