Python3安装
- yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel gcc
- 下载源码包到/opt下面,解包,创建文件夹
mkdir /usr/local/python3
- 执行
./configure --prefix=/usr/local/python3
- 执行
make
- 执行
make install
- 执行以下命令,修改软连接
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
这样增加软连接需要运行的时候执行python3 文件
就行,这样就不需要改yum配置了
Python3常识
- 变量的命名规则是字母,数字和下划线的组合,不能以数字开头。(大小写是敏感区分的)
- 变量名字要有具体的意义,a = 2(将变量a指向2这片内存)
- 常量是值基本固定不变的,大家一般全部大写来命名
- 注释,单行用#,多行用
“”“注释的内容”“”
- 交互
a = input("")
,键盘输入值后会储存为字符串类型 end=','
会让结果输出在同一行- rang(5,10)就是(5,6,7,8,9),rang(10)就是(0,1,2,3,4,5,6,7,8,9)
- python3默认的编码就是utf-8了,不过大部分人怕运行环境不正常,还是习惯加#
coding=utf-8
,最早ascii用8位表示一个字符,Unicode用16位,utf-8可变成字符编码,用8位表示一个英文字符,用24位表示一个中文,GBK用8位表示英文字符,16位表示中文。 - 编码,
a="kkbox" ,b=a.encode("utf-8")
此时b已经变为bytes类型的数据了,用于网络传输和保存。反之解码,decode(“utf-8”)
常用数据类型
- int
整型,32位服务器和64位服务器的最大值不同,可以支持+,-,*,/,**,%取余 - string
字符串类型,通常“abc123”,字符串可以+拼接在一起,“abc123”*2,字符串前面加r的r“abc\r123”
的话,字符串里面内容保持原样,不转义。更多用法参考http://www.runoob.com/python3/python3-string.html - 布尔型
包含True和False - 列表
list是Python中最基本的数据结构。列表中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。例如list1 = ['Google', 'Runoob', 1997, 2000]
,更多用法参考http://www.runoob.com/python3/python3-tuple.html - 字典
dict是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key:value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,例子:
dict = {'Alice': '2341', 'Beth': '9102'}
,更多用法http://www.runoob.com/python3/python3-dictionary.html - 集合
集合(set)是一个无序的不重复元素序列。可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。更多用法http://www.runoob.com/python3/python3-set.html - 元祖
tuple与列表类似,不同之处在于元组的元素不能修改,也叫只读列表。a = ('Google', 'Runoob', 1997, 2000)
,更多用法参考http://www.runoob.com/python3/python3-tuple.html
逻辑相关基础
-
if 语句
if condition_1: pass elif condition_2: pass else: pass
condition_1是判断条件,这样判断结果就True和False两种,elif就是多个判断了(类似C的switch),建议把大概率的事件条件写在前头,这样条件判断大概率命中,执行效率高。同时逻辑语句之间是可以嵌套的,注意缩进
-
while 循环
n = 100 sum = 0 counter = 1 while counter <= n: sum = sum + counter counter += 1 else: pass ``` 这个while循环的例子sum变量最后就是1到100的累加和,只要是条件成立,就一直循环下去,如果条件一直为真就是无限循环了,else不是必须的,如果带有,就是当循环条件不成立时执行的
-
for 循环
for循环可以遍历任何序列的项目,如一个列表或者一个字符串languages = ["C", "C++", "Perl", "Python"] for tmp in languages: if tmp=="Perl": break else: print(tmp) ``` break 语句可以跳出 for 和 while 的循环体。如果你从 for 或 while 循环中终止,任何对应的循环 else 块将不执行。continue语句被用来告诉Python跳过当前循环块中的剩余语句,然后继续进行下一轮循环。 ## 异常处理 1. 在程序开发中,如果对某些代码的执行不能确定是否正确,可以增加 try(尝试) 来 捕获异常 捕获异常最简单的语法格式: ```python try: # 提示用户输入一个数字 num = int(input("请输入数字:")) except: print("请输入正确的数字") ``` ## 文件相关操作 - 基本实例 ```python f=open("d:\爱情动作片\Ebody.avi",mode="r") content=f.read() print(content) f.close() ``` - 模式 r,只读模式,文件不存在的话程序报错 r+,读写模式,文件不存在的话程序报错,写的时候增加在原始数据前头 w,写模式,文件存在重头编辑,原来内容会丢失!不存在,就创建新的文件。 w+,读写模式,文件处理方式同上 a,追加模式,如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 a+,追加读写模式,处理文件方式通上 - 基本方法 ```python f.read() 读 f.write() 写 f.readline() 读取一行 f.readlines() 读取所有行,保存为一个列表 特殊用法for line in f:print(line, end='') 这个会按一行一行遍历打印内容 f.tell() 返回文件对象当前指针所处的位置, 它是从文件开头开始算起的字节数。 f.seek() 如果要改变文件当前的位置, 可以使用 f.seek(offset, from_what) 函数 f.close() 记得用完关闭 ``` ## 函数 - 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段 - return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None,函数里碰到return就结束了,返回值可以是任何数据。如果返回多个值,单个变量接收,变量是元组类型,不可修改。 ```python def my_sum(a,b,*args,**kwargs): c=a+b for tmp in args: res=c+tmp print(res) 动态参数args在函数里是一个元组,可以接收无数个位置参数,但接收不了关键字参数,kwargs在函数里是一个字典, 可以接收无数个关键字参数,假如2个都存在,各司其职。 所以正常顺序是位置参数,*args,默认参数,**kwargs ``` - 函数变量的作用域,只在函数体内有效,函数外部无法使用,全局变量,可以被函数内部使用,但是永远不建议这么用。 - [菜鸟教程内置函数](https://www.runoob.com/python3/python3-built-in-functions.html) ## 装饰器decorate - 装饰器本身是一个函数,用来装饰其他函数 - 在不改变原来函数的代码情况下,增加新的功能,且不改变调用方式 ```python import time def xxoo(func): def deco(*args,**kwargs): start_time = time.time() end_time = time.time() print("time is %s" %(end_time-start_time)) return deco @xxoo def test(name,age): time.sleep(3) print("this is in test,name is %s,age is %d" %(name,age))
序列化
序列化——将字典,列表等类型的数据转化为字符串类型的数据的过程称为序列化。一般用于文件写入,或者网络传输之用
-
json 只有一部分数据类型(数字,字符串,列表,字典,元组)可以使用json转化成字符串类型,尽量使用json
-
pickle 所有数据类型都可以使用pickle转化成字符串类型
import json xxoo = {"username":"alex","passwd":"alex311"} # dumps和loads是操作内存中的数据,序列化和反序列化后还在内存中 ret = json.dumps(xxoo) print(type(ret),ret) f = open("database","w",encode = "utf-8") # dump和load是操作文件中的数据,序列化和反序列化后都在文件中 json.dump(xxoo,f) f.close # load 需要以读的方式打开文件,然后json.load(f)
-
[] 列表类型
-
() 元组,tuple类型数据不可以修改,只读
-
{} 字典类型,集合。创建一个空集合必须用 set(),set自动去重复了
-
如果文件的数据非常大又需要json时,使用for循环和json.dumps,对每个数据进行序列化,然后f.write(数据+“\n”),读的时候使用文件一行一行读
软件编程基本规范
- 文件目录结构
bin目录:所有可执行文件的目录
plugin目录:插件目录
main目录:软件主要代码目录
docs目录:说明文档目录,一般包含requirements.txt,README.text
conf目录:配置文件目录,一般有setting.py
resource目录:软件需要用到的资源目录,图片,声音等等
- 路径相关
import os
pwd = os.getcwd() #获取当前文件目录
project_pwd = os.path.dirname(pwd) #获取当前文件的父目录
import sys
sys.path.append(project_pwd) #把文件目录加入到python环境变量中
import plugin,main #这样就可以搜寻到了
- if name == ‘main’
if __name__ == '__main__'
当该.py文件被直接运行时,if __name__ == '__main__'下的代码块将被运行
当该.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行
匿名函数
有时候一些简单的函数,只需要用一次,就有可能用匿名函数myadd=lambda x,y:x+y
,执行myadd(2,3)就是5,其中x,y是参数,x+y是表达式
递归函数
本质是一个嵌套函数,自己调用自己,比如文件搜索时候,判断是否是是目录,是目录继续进入目录
def sb(x):
if x <= 1:
print(x)
else:
sb(0.5x)
装饰器
func是原来已经写好的函数,wrapper是装饰器固定格式。
def wrapper(k): #k其实是被装饰的函数名字
def inner(*args,**kwargs)
ret = k(*args,**kwargs)
retun ret
return inner
@wrapper
def func():
print("xxxx")