2018年5月28日
第一节,数字类型及序列类型
00-数字类型
符号数字类型(全部不可变)
float浮点数
bool布尔值(True,False)
complex复数
int整数
浮点数运算不精确(用decimal )
例子: In[1]: import decimal
In[2]: a=decimal.Decimal("1.2")
In[3]: b=decimal.Decimal("1.1")
In[4]: a-b
Out[5]: Decimal("0.1")
例子: In[8]:1.2-1.1
Out[9]: 0.09999999999999987
Ceil : 向上取整
例子: In[1]:import math
In[2]:math.ceil(5/3)
Out[3]:2 #结果
//取整运算符(无论除不除得断,舍弃小数部分)
%取余运算符
**幂运算
01-序列类型
str(不可变)字符串:“abv” list(可变)
list(可变)列表:["1",2,"qww"]
tuple(不可变)元组:(1,3.14,"abc")或者(1,)或者1,
python里内置的函数就是bif
索引取值:
例子:a=[1,'hello','word']或者b=(1,'hello','word')
a[0]或者b[0]
1 #输出
列表可变元组不可变:
a=1 a指向一个内存空间将1存入
a=2 a指向程序再开辟一个的空间,将2存入
a
2
id(a) 查看a的地址,两次地址不一样,只是指向改变了,存储内容没有变
a=[1,'hello','word']
b=(1,'hello','word')
a[0]=2
a:a=[2,'hello','word']
b[0]=2
b:报错error
切片操作:
a=[1,'hello','word']
a[0:3]或者a[0:]或者a[:3]或者a[:-1]或者a[-3:] #左闭右开,取全部
不同序列类型转换:
int(3.14) #出来整数3 其他类型也如此
判断元素是否在列表里:
a=[1,'hello','world']
1 in a #成员运算符
True
1 not in a #成员运算符
False
第二节,序列类型的方法
00-列表的方法
dir(list)可查询list中的方法
增加删除修改查找复制
append(加入的元素) <加在最后面,只能插入单个元素,可以是列表>clear() <删除所有数据>索引赋值index(元素) <查找元素位置,有相同元素则只查第一个,不存在则报错>copy()
insert(插入的位置,插入元素) <只能插入单个元素>pop(可以添加位置参数) <不添加位置参数则删除最后一个元素并返回最后一个元素>count(元素) <统计元素在列表中出现次数,如果元素不存在则返回0>反序reverse()
extend(列表或者元组) <可插入多个数据到最后面>remove(元素) <有相同元素则删除第一个>默认从小到大排序sort()
01-字符串的方法
查找与判断修改拼接
count(元素) <统计元素在字符串里出现次数,不存在则返回0>upper()<将所有小写改为大写>+ <用加好直接将字符串拼接起来>
find(元素) <查找元素索引位置,多个则只找第一个出现的,若不存在则返回-1>lower()<将所有大写改为小写>字符串3.join([字符串1,字符串2]) <将字符串1和字符串2用字符串3拼接在一起>
index(元素)<查找元素索引位置,多个则只找第一个出现的,若不存在则报错>strip(元素)<删除字符串开头和结尾的字符>
isdigit() <判断是否全为数字组成>capitalize() <将第一个单词首字母大写>
isalpha()<判断是否全为字母组成>title() <将所有单词首字母大写>
endswith(元素)<判断是否以元素参数结尾>split(元素) <将字符串分开并将其存入列表,不指定则指定空格,分割符会被丢掉>
startswith(元素)<判断是否以元素参数开头>replace(旧字符,新字符) <用新字符替换旧字符>
islower()<判断字符串的字母是否全为小写>
isupper() <判断字符串所有字母是否为大写>
02-转义字符
\n换行符
\t制表符
\b退格符(光标退回一格)
\r光标回到开头
\\\
\'‘
\0空字符
\a系统提示音
如果想将字符串转义去掉,在转义前加上r即可
03-元组的方法
查找
count(元素) <统计元素出现次数>
index(索引位置) <查找位置的元素>
第三节,使用vim编写Python代码
01-linux常用命令
命令作用命令作用
pwd返回当前目录cat -n install .sh查看文件内容并显示行数
ls查看当前目录下的文件和文件夹cp (文件名) (复制的路径)复制文件到想去的路径
cd 路径(绝对或相对路径)相对路径:在当前目录下直接打开文件 绝对路径:从根目录开始写rm 文件名删除文件
cd -返回上一级(只能返回一次)rm -r 文件夹名删除文件夹
cd /到根目录mv 文件名 路径移动文件
cd或者cd ~回到家目录cd ..上一级目录(可重复使用)
su 用户名切换用户mkdir创建文件夹
touch 文件名创建文件rmdir删除空的文件夹
cat 文件名查看文件内容
02-vim的使用
交互环境指我们输一条就输出一条
exit() 退出交互环境
deactivate 退出虚拟环境
vim 文件名 用vim编辑文件如果没有则自动创建
vim有命令模式,输入模式,末行模式
命令模式:q 退出vim,:wq 保存后退出,:q!强制退出
进入(命令模式)退出(命令模式)移动光标(命令模式)输入模式复制和粘贴删除
vim 文件名:q 退出gg (移动到第一行)i(进入输入模式)yy(复制整行)dd(删除光标所在乎)
:wq 保存后退出G(shift+g)(移动到最后一行)I(在行首进入输入模式)p(粘贴)dw(删除光标到单词结尾)
:q!强制退出^(移动到非空格行)a(在光标后面一个字符添加)9yy(复制9行从光标开始向下九行)x(删除光标所在的字符)
0(移动到行首)A(在行尾进行添加)yw(复制当前光标到单词词尾的内容)u(撤销上一次操作)
$(移动到行尾)o(在光标下面加一行)ctrl+r(撤销u操作)
O(在光标上面加一行)
块操作查找
v(光标可以自由选中):/a或者?a(查找所有a)
ctrl+v(列块选择)n(/向下查找,?向上查找)
shift+*(查找光标所在字符串)
命令行按F5自动执行代码
03-虚拟环境使用
虚拟机用来装系统,
命令意义
workon查看有哪些虚拟环境
workon 虚拟环境名进入虚拟环境
deactivate退出虚拟环境
mkvirtualenv 虚拟环境名(默认python2)创建虚拟环境
which 程序名查看程序安装在哪里
mkvirtualenv -p /usr/bin/python3 py3创建名为py3的虚拟环境
rmvirtualenv 虚拟环境名删除虚拟环境
第四节,格式化输出,字符串拼接和深浅复制
00-格式化输出
占位符例子
%d“hello %d”%(1)
%s
%f
%cASCII码格式化
%o8进制
%x16进制
%e科学计数法
%-8s占位字符最小要8位,并左对齐
%.2f小数后面保留2位
%+8d 正号,最小占位8位
01-format格式化
例子:“hello{}”.format("world")
"hello {1} {0}".format("world","python")
输出:hello python world
"hello {ab}".format(ab="python")
输出:hello python
"{a:<10}".format(a=1234) #后面填充的必须为10个,如果没有在前面加空格补齐,并左对齐
"{a:x^10}".format(a=1234) #后面填充为10个,前后用x填充
01-字符串编码
ASCII码表:只能表示英文字母和符号
GBK编码:中国特有的
iso指定统一标准:unicode字符集:企图将地球上所有语言囊括,浪费空间,更新后出现UTF-8,UTF-16等
Python中都是Unicode方式存储
编码:“字符串”.encode("utf8")
解码:" ".decode("utf8")
02-深浅复制
针对列表来说的
列表里可以放列表
a=[1,2,3,["a",1,2]]
a.copy() #浅复制,只能复制一层,不能复制里层的列表只能引用
深复制
import copy
b=copy.deepcopy(a)
03-bytes和bytearray
bytes:二进制序列不可修改
bytearray:二进制序列可修改
第五节,散列类型,逻辑运算符
进入后在末尾加workon py3env
ipython #以后直接进入Python环境
00-散列类型
01-set(集合)--不可变
不能出现重复元素,用大括号括起来
{1,“2”,3}
set([1,2,3])
&交集
|并集
-差集(补集)
方法
S.add(x) x只能为不可变类型S.copy()s.remove()S.issubset(T) 判断S是否是T的子集
S.clear()S.pop(元素) 若不添加元素则随机删除一个S.isdisjoint(T) 有交集返回FalseS.issuperset(T) 判断T是否是S的子集
S.copy()s.discard()len(S)
s.update(列表或元组) 添加列表或元组里的内容到集合x in Sx not in S
02-dict(字典)---可变的散列类型
01,定义
di1={'key':'value'} #键值对形式存在,建相当于一个变量
#key不能重复,value可以重复,key不能是可变数据类型,value可以是可变数据类型
#无序的
di2=dict() #定义空字典
02,字典的方法
di1={1:‘s’}
di1.clear() #清空字典
dil.setdefault(1,'3') #如果key存在则查询,不存在则添加
dil.pop(1) #删除key对应的键值对,不存在则报错
dil.popitem() #随机删除
dil.get(1) #获取指定key对应的value,不存在则返回none
dil.keys() #取出所有的key,并输出一个list
dil.values() #取出所有的value,并输出一个list
dil.items() #取出所有的键值对
dil.updata({3:'7'}) #添加字典到字典,key重复则覆盖
di1=dict.fromkeys(('abcd','聆听'))#返回一个字典,字典的key是第一个参数的拆分,value是第二个参数
print(dil)
{'b':'聆听','a':'聆听','c':'聆听','d':'聆听'} #输出
01-运算符优先级
优先级从上到下越来越低
**幂运算
+ -一元运算(正负号)
* / %算术运算符
+ -
< > <= >=比较运算符
== !=
= %= /= += *= **=赋值运算符
is is not身份运算符
in not in成员运算符
not>and>or逻辑运算符
02-逻辑运算
isinstance(1,int) #用来判断参数1是否为参数2所表示的类型
and #与
or #或
not #非
第六节,控制流程
00-条件判断
if 判断语句1:
执行语句1
elif 判断语句2:
执行语句2
...
else:
执行语句
01-三目运算
执行语句1 if 条件语句 else 执行语句
02-条件循环
while 判断语句:
循环体
break :跳出循环
else:只要条件不满足就执行else
continue:只结束当前循环,继续下一次循环
for in obj:
循环体
第七节,函数基础
00-函数基础
定义:
def 函数名(参数):
pass
return 表达式
函数调用:
函数名(参数)
01-函数参数
不定长参数:
*args 存到元组里
关键字参数:
**kwargs #将a=1,b=2,这样的参数变成键值对放到字典里,关键字参数必须放到参数最后
02-常见内置函数
sorted(对象,reverse=True/False)排序,有返回值ord()字符转ASCII
dir(builtins)查看python里所有函数chr()ASCII码转字符
len(对象)查看对象长度filter(函数,参数)过滤器
min()求最小值map(函数,参数)筛选
max()求最大值zip(序列类型1,序列类型2)对应
reversed()反向eval()把字符串当成代码运行
sum()求和exec()与eval()用法一样,只是没有返回值
bin()转换为二进制
oct()转换为八进制
hex()转换为十六进制
第八节,函数作用域及闭包
00-函数作用域
匿名函数 lambda
lambda 参数:表达式
filter(func,a)
filter(lambda x:x%2==0,a) #输出a中的偶数
filter(map(lambda x:x*x,a))
局部变量只能作用于局部
全局变量可作用于局部
globle #声明全局变量,z在局部修改全局要声明
nonlocal #修改局部变量
变量命名规则:
小驼峰规则:首字母除了第一个其他都大写
大驼峰规则:首字母全部大写
全局变量:全大写用下划线连接
01-闭包
闭包是函数里面嵌套函数,外层函数返回里层函数,这种情况称之为闭包闭包是概念,不是某种函数类型,和递归的概念类似,就是种特殊的函数调用闭包可以得到外层函数的局部变量,是函数内部和函数外部沟通的桥梁
闭包:
def fx(x):
x += 1
def fy(y):
return x*y
return fy
def calculate(operator='+'):
def add_func(x,y):
return x+y
def sub_func(x,y):
return x-y
if num == '+':
return add_func
elif num == '-':
return sub_func
else:
return None
resualt = calculate('+')
print(resualt(3,2))
resualt = calculate('-')
print(resualt(3,2))
02-递归和回调函数
递归
阶乘:
def factorial(n):
if n == 1:
return 1
return factorial(n-1)*n
递归中可以函数自身调用自身,但是使用时类似于条件循环一样,要有递归的终止条件
回调(函数里面调用自己)
示例:
def choice(callback, ch):
if ch:
callback()
else:
print(‘做一些见不得人的勾当')
def play():
print(‘好像没有人啊')
choice(play, 1)
回调函数: 自身是一个函数,只是被传入到另一个函数当中,供其调用
回调函数不一定会被调用,是否调用由被传入函数的内部逻辑决定
第九节,类和对象
00-面向对象
相关的变量和函数都“封装”在对象里,以对象为单位整理代码
01-类和实例
类:是一类事物的抽象,不是真实存在的,描绘了该类事物的共性
实例(对象):某类事物的具体个体,是该类事物的具体表现,它是真实存在的
类一般用大驼峰,函数一般用小驼峰
#定义类
class Person:
#实例化对象
a=Person() #实例化的对象赋予a
02-属性封装
类的属性就是变量
封装在“实例”里的变量,是实例的特征
每个实例都是一个独立的变量空间
私有属性:
在属性前加两个下划线则为私有属性,私有属性只能在类里面用
在python中有两私有属性,分别是在属性前加 一个下换线(_)(被保护的) 和 两个下划线(__)
03-方法
把函数写在类里面就是方法
通常,将默认会传入的那个参数命名为self,用来表示调用这个方法的实例对象本身。
class Person:
name="人"
def func(self): #self表示一个实例对象
print("{}:hhhhh".format(self.name))
a=Person() #实例化一个对象
#a.func() #将对象a传给了func
#Person.func(1) #用类调用必须传个参数
a.name="daisy"
a.func()
04-初始化(魔术方法)
魔法方法:名字前后都有两个下划线。
class Person:
def __init__(self,name,sex): #初始化方法,实例的时候自动执行
self.name=name
self.sex=sex
a=Person("daisy","nv")
第十章,继承与魔术方法
00-继承
一个类可以继承一个类(自己有则不继承,自己没有才去继承)
class A:
pass
class B(A): #B继承A
pass
class C(A,B): #多继承,C先继承A,再继承B
#从左到右的原则继承
pass
广度优先算法(python3):一层一层的来
深度优先算法:从一条线走完再从头开始
类名.mro #查看继承顺序
顶级基类object,python3中默认有,python中所有类都是从object中继承来的
类名.bases #查看父类
01-多继承
class C(A,B):
def play(self):
A.play(self) #调用A方法,需要什么参数传什么
print("这是C")
class C(A,B):
def play(self):
super().play() #都可以用,按顺序先A后B,不用传参数
print("这是C")
02-魔术方法
class C:
def __init__(self,a):
self.a=a
def __add__(self,other): #other和self一样表示实例化的对象
print(str(self.a)+str(other.a))
def __str__(self): #使用print时才会触发,向用户友好
return XXXX
def __repr__(self): #,使用print才触发,有__str__则用__str__,向开发者友好
return XXXX
int1=C(10)
int2=C(5)
int1+int2 #有+号则触发__add__
一般实例不能像函数调用,如果要用则要用__call__方法
class C:
def __init__(self,a):
self.a=a
def __call__(self,*args,**kwargs):
return "hhhhhh"
a=C(1)
a() #调用实例则触发__call__方法
__class__ 查看类名
__base__ 查看继承的父类
__bases__ 查看继承的全部父类
__dict__ 查看全部属性,返回属性和属性值键值对形式
__doc__ 查看对象文档,即类中的注释(用引号注释的部分)
__dir__ 查看全部属性和方法
第十一章,描述器与装饰器
00-定制属性访问
查找:
hasattr(re, 'length')# 返回bool值,判断re实例有没有length属性getattr(re, 'length')# 返回属性值,触发__getattr__方法b. __getattribute__('length') # 返回属性值,调用存在属性不触发,不存在则触发
增加和修改:
setattr(b, ‘length’, 6) #没有返回值,对实例b的length属性添加值6b.__setattr__('length', 5)
删:
delattr(b, 'ccc')#没有返回值b.__delattr__('bbb')del b
class Persons: def __init__(self,name): self.name=nametest=Persons()print(hasatter(test,"name")) #判断test对象有没有name属性
01-new方法
__new__class Person: def __new__(cls,*args,**kwargs): print("XXXXXX")test=Person(10) #先调用new方法,然后再是init方法,实例化就触发
class Earth: def __new__(cls): if not hasattr(cls, 'instance'): cls.instance = super().__new__(cls) return cls.instance def __init__(self): self.name = 'earth'e = Earth()print(e, id(e))a = Earth()print(a, id(a))在上面的例子中,我们可以看到两个实例的ID是相同的意味着这两个其实引用的是同一个实例,是一个实例的不同名字
02-描述器
用一个类来管理另外一个“类属性”,用来控制另一个类属性的访问,修改和删除
类属性:访问 __get__
赋值:__set__
删除:__deleter__
class MyAtrribute: def __get__(self, instance, owner): print('get') def __set__(self, instance, value): print('set') def __delete__(self, instance): print('del')class MyClass: m = MyAtrribute() def __del__(self): print('instance delete') c = MyClass()c.m #触发__get__c.m = 1 #触发__set__del c.m #删除__delete__这类里面实例化另一个类,对这个实例做访问时,需要定义 __get__ __set__ __delete__ 方法
03-装饰器
在不改变函数里代码的情况下给它添加新的功能
下面这里实现了给函数添加新功能
类也可以做装饰器,但是需要定义 call 方法
04-常用内置装饰器