文章目录
下篇高级部分: https://blog.youkuaiyun.com/wang342626/article/details/89005048
python的中文API: https://docs.python.org/zh-cn/3/
其他中文API: python3-cookbook
基本操作
字符串
str = '123'
str = "123"
str = """123"""
n = len(str)
字符串的格式化
"大家好,我叫{0},我{1}岁了".format('张三',23)
"大家好,我叫{name},我{age}岁了".format(name='张三',age=23)
# 像C语言的格式化方法
print("%d的阶乘是:%d" % (n,x) )
字符串的更多函数:
https://fishc.com.cn/forum.php?mod=viewthread&tid=38992&extra=page%3D1%26filter%3Dtypeid%26typeid%3D403
输入输出
x = input("请输入一个数字")
x=int(x)
if(x==8):
print("对了")
else:
print("错误")
强制转换
a = int(x)
str(x)
float(x)
# 没有double(x)
# 类型
type(x)
# 是不是这个类型,返回true false
isinstance(x,int)
基本运算
5/2 是2.5
5//2 是2
3**2 是平方
9**0.5 是根号
逻辑操作符
and 不能用&&
or
not
# 断言
assert 3>4
# false即可中断程序,用于调试
if 和 while 和 for
if x>4:
print("大于4")
if(x>5):
print("大于5")
elif x<10:
print("小于10")
for num in range(5):
print(num) #默认输出一个数和一个回车
for num in range(5,10):
print(num,end=' ') #输出一个数和一个空格
内置函数
int()
float()
help()
input() # 输入数值
raw_input() # 输入字符串
bin() # 转为二进制
oct() # 转为八进制
hex() #转为十六进制
ord('a') #返回a的ASCII码,是97
chr(65) #返回65对应的字母
import math
dir(math) # 查看math模块的函数
help(math.sqrt()) # 查看sqrt函数用法
数据结构
列表
python没有数组
list=['wang',23,'男',"电脑"]
print(list)
for item in list:
print(item)
# 追加一个元素
list.append('学习')
# 追加另一个列表
list2=['C语言','java','python'];
list.extend(list2)
# 插入,下标从0开始
list.insert(0,'哈哈')
n = len(list) #长度
item = list[0] #获取第0个
#删除元素
list.remove('wang')
# 删除第0个
list.pop(2)
del list[0]
del list #清空列表
# 删除最后一个
list.pop()
# 切片,截取1到3位置的元素
list2 = list[1:3]
list2 = list[:3] #截取0到3位置的元素
list2=list[:] #截取全部的元素,列表复制
list2=list #这只是地址复制,改变list,list2也会改变的
# 列表比较大小,先比较第0位置的元素,再继续比较剩下的
list1>list2
# 列表+列表
list3 = list+list2
# 列表复制3次
list3 = list*3
列表内置函数
list.count('wang') #计数'wang'出现几次
list.index('wang') #找到第一次出现'wang'的下标
list.clear() # 清空列表
del list # 清空列表
list.reverse()
list.sort() #排序
list.sort(reverse=True) # 倒过来排序
n = len(list)
sum(list)
max(1,2)
min(list)
max("Hello")
sorted(list)
list.sort()
reversed(list)
list.reverse()
元组
tuple = (1,2,3)
tuple = (1,) #只有1个元素
tuple=() #有0个元素
不可以修改元组内元素的值,和列表不一样
元组支持连接,乘法操作
字符串属于元组
字典
默认会按照key排序的
dict1 = {'wang':23,'zhang':20,'li':30}
dict2 = dict(wang=23,zhang=20)
dict1['zhang']=200
len(dict1)
x=dict1.get(10000)
print(x) #输出None
x = dict1[10000] # 报错
x=dict1.get(1000,'没有')
print(x) #如果存在就输出值,如果不存在就输出没有
if(key in dict1):
print("Yes")
遍历
# 遍历每一项
for key,value in dict1.items():
print(key,value)
# 遍历key
for key in dict1.keys():
print(key,dict1[key])
# 遍历value
for value in dict1.values():
print(value)
# 按照key排序后再遍历
for key,value in sorted(dict1.items()):
print(key,value)
dict1 = {}
dict1 = dict.fromkeys((1,2,3),'wang')
print(dict1) # {1: 'wang', 2: 'wang', 3: 'wang'}
dict1.pop(1) #删除key
dict1.popitem() #随机删除一项
集合
set1 = {5,3,1,8}
list1 = [1,5,3,4]
set2 = set(list1)
if(5 in set1):
print("Yes")
set1.add(8)
set1.remove(8)
set3 = frozenset(list1) #不可变的集合,不可以添加删除元素
# 序列化
>>> nums=[6, 9, 4, 1, 3, 2]
>>> list(enumerate(nums))
[(0, 6), (1, 9), (2, 4), (3, 1), (4, 3), (5, 2)]
>>> a=['wang','li','zhang']
>>> b=[20,30,40,10,50,60]
>>> list(zip(a,b))
[('wang', 20), ('li', 30), ('zhang', 40)]
函数
# 判断是不是质数
def isPrime(n):
for i in range(2,n//2):
if(n%i==0):
return False
return True
# 调用
res = isPrime(2)
res = isPrime(n=12)
函数内的变量全都是局部变量,想用全局变量用global修饰
x=50
def func():
global x
x=20
传递列表可以修改值,其他传递参数不可以修改值
# 这个列表是可以修改值的,并且永久有效
def fun1(nameList):
nameList[0]='wang'
for name in nameList:
print(name)
#这样调用可以允许修改值
fun1(list)
# 这样调用传递副本过去,防止修改数据
fun1(list[:])
从模块中导入函数
# 从Module.py中导入函数
from Module import fun1
fun1('zhang','san',age=16,sex='男')
import Module as m
m.fun1('zhang','san',age=16,sex='男')
内嵌函数
# 内嵌函数
def fun1():
print("fun1被调用了")
def fun2():
print("fun2被调用了")
fun2()
# 调用
fun1()
闭包函数
# 闭包函数
def fun1(x):
def fun2(y):
return x*y
return fun2 #不能加圆括号
# 调用方法1
i = fun1(5)
res = i(8)
print(res) # 结果是40
# 调用方法2
res = fun1(6)(7)
print(res) # 结果是42
# 闭包函数
def fun1():
x=5
def fun2():
nonlocal x # 申明为非局部变量,使用父亲的变量
x =x*x
return x
return fun2() # 加圆括号
# 调用方法
i = fun1()
print(i)
必选参数, 默认参数,可选参数,关键字参数
可选参数会打包成元组, 关键字参数打包成字典
def func(sid, name, grade=2015, *args, **kwargs):
print("sid:" + sid)
print("name:" + name)
print(grade)
print(args)
print(kwargs)
调用:
func('15001', 'wang', 2016, 1, 2, 3, age=20, sex='男')
输出结果:
sid:15001
name:wang
2016
(1, 2, 3)
{'age': 20, 'sex': '男'}
调用:
func(sid='15001', name='wang', grade=2016, a=1, b=2, c=3, age=20, sex='男')
输出结果:
sid:15001
name:wang
2016
()
{'a': 1, 'b': 2, 'c': 3, 'age': 20, 'sex': '男'}
def func(*args,**kwargs):
print(args)
print(kwargs)
调用:
func(a=1,b=2,c=3,age=20,sex='男')
输出结果:
()
{'a': 1, 'b': 2, 'c': 3, 'age': 20, 'sex': '男'}
调用:
func(a=1,b=2,c=3,age=20,sex='男')
输出结果:
()
{'a': 1, 'b': 2, 'c': 3, 'age': 20, 'sex': '男'}
匿名函数
# 匿名函数
f = lambda x:2*x+1
print(f(4)) # 结果是9
过滤器
# 偶数返回false
def odd(x):
if(x%2==0):
return False
else:
return True
lst=[0,1,2,3,4]
obj = filter(odd,lst) # 过滤掉偶数
print(list(obj))
# 使用匿名函数,代码简洁
list(filter(lambda x:x%2, range(10)))
文件
文件读写模式: http://www.runoob.com/python/python-files-io.html
f = open("D:\\1.txt") # 默认是GB2312编码,默认只读权限
f = open("D://1.txt",'r',encoding='utf-8')
x=f.readline() # 读取一行文字
x = f.read() # 默认参数是-1读取全部内容
x=f.tell() # 告诉文件光标的位置
x=f.seek(6,0) # 光标从第0位置向后移动6个位置
f.close()
遍历文本
# 推荐这样遍历文件
for each in f:
print(each,end='')
list1 = list(f) # 文件按照行转为字符串列表
# 这样遍历文件效率特别低
lines = list(f)
for each in lines:
print(each,end='')
写入文本
f = open("D://1.txt",'w') # w表示创建新文件或者覆盖写入,默认GB2312编码
f = open("D://1.txt",'w',encoding='utf-8')
f.writelines("你在干嘛呢")
f.write('哈哈哈哈')
f.close()
使用with后不管with中的代码出现什么错误,都会进行对当前对象进行清理工作,都会执行file.close()方法
try:
with open("D:\\不存在的文件") as f:
x=f.read()
print(x)
except Exception as err:
print(err)
写入二进制数据
import pickle
list1 = [123,3.14,'小甲鱼']
file = open('D:\\1.data','wb') #二进制写入文件
pickle.dump(list1,file)
file.close()
读取二进制数据
import pickle
file = open('D://1.data','rb')
list2 = pickle.load(file)
print(list2)
删除文件
import os
#判断文件是否存在
if(os.path.exists(dirPath+"foo.txt")):
os.remove(dirPath+"foo.txt")
模块
import random
x = random.randint(1,10) #产生随机数[1,10)
import random as r
r.randint(1,10)
# 从列表中随机选一个
string = random.choice(list1)
import os
os.getcwd() # 输出当前工作路径
os.chdir("D:\\") # 改变路径
os.listdir(path='D:\\') #输出路径下面的所有文件和文件夹
os.system('cmd') # 运行shell命令
os.system('calc') #打开计算器
from 语句让你从模块中导入一个指定的部分到当前命名空间中
# 只会将 模块文件Module.py 里的 ElectricCar单个类引入进来
from Module import ElectricCar
安装模块的3个方法:
方法1:使用pycharm安装
需要配置为清华源 https://pypi.tuna.tsinghua.edu.cn/simple/
方法2:pip安装
cmd中输入 pip install -i http://mirrors.aliyun.com/pypi/simple/ django
或者 python -m pip install PyQt5 -i https://mirrors.aliyun.com/pypi/simple/
方法3: 下载whl文件后再安装
cmd中输入 pip install D:\\Twisted-18.7.0.dev0-cp37-cp37m-win_amd64.whl
注意:
其中cp37表示python3.7版本
路径分隔符是\\
关于__init__
__init__.py
为空
student.py
中有个类class Stu:
那么test.py中可以写
from model.student import Stu
a = Stu('xiaoming')
详见:https://github.com/chenyuntc/pytorch-book/blob/master/chapter6-xxx.md 6.1.3部分
异常处理
更多异常: http://www.runoob.com/python/python-exceptions.html
try:
a = int("abc")
f = open("不存在的文件.txt")
print(f.read())
f.close()
except OSError as err:
print(err)
except ValueError as err:
print(err)
finally:
print("拜拜")
文件IO异常使用with更加简洁
else也可以与while搭配
while x>0:
x-=1
else:
print("x<=0")
else也可以与异常搭配
try:
x=int('123')
except ValueError as err:
print(err)
else:
print("没有数字转换异常")
easygui
安装方法: cmd中输入pip install --upgrade easygui
import easygui as g
import sys
while 1:
g.msgbox("嗨,欢迎进入第一个界面小游戏^_^")
msg ="请问你希望在鱼C工作室学习到什么知识呢?"
title = "小游戏互动"
choices = ["谈恋爱", "编程", "OOXX", "琴棋书画"]
choice = g.choicebox(msg, title, choices)
# note that we convert choice to string, in case
# the user cancelled the choice, and we got None.
g.msgbox("你的选择是: " + str(choice), "结果")
msg = "你希望重新开始小游戏吗?"
title = "请选择"
if g.ccbox(msg, title): # show a Continue/Cancel dialog
pass # 用户继续玩游戏
else:
sys.exit(0) # 用户取消就退出
面向对象
class Student:
name="" #共有属性
__age=0 #两个下划线开头的是私有属性
# 构造函数
def __init__(self,name,age):
self.name = name
def sayHello(self):
print(self.name,"你好")
# 两个下划线开头的是私有函数,外人无法访问
def __no(self):
print("两个下划线开头的是私有函数,外人无法访问")
# 控制私有属性
def setAge(self,age):
self.__age = age
def getAge(self):
return self.__age
stu = Student('wang',24)
stu.sayHello()
继承
class Person:
def __init__(self):
self.name = "Person"
self.age = 0
def hello(self):
print("xx向你问好")
# 继承Person
class Boy(Person):
def __init__(self):
super().__init__() # 调用父类的函数
self.hobby = "玩游戏"
def hello(self):
print("Boy向你问好")
python支持多重继承
class Student(Base1,Base2):
...
组合
class Turtle:
def __init__(self,num):
self.num = num
class Fish:
def __init__(self,num):
self.num = num
# 水池里包含乌龟和鱼
class Pool:
def __init__(self,turtleNums,fishNums):
self.turtle = Turtle(turtleNums)
self.fish = Fish(fishNums)
def showPool(self):
print("该水池里共有乌龟%d只,小鱼%d条"%(self.turtle.num,self.fish.num))
p = Pool(5,6)
p.showPool()
BIF(bulit in function)内置函数
class A:
pass
class B(A):
pass
# 判断B是不是A的子类
issubclass(B,A) #True
issubclass(B,B) #True
issubclass(B,object) #True
# 判断是不是这个类
isinstance(object,classInfo)
hasattr(stu,'sno')
x = getattr(stu,'name',"没有找到")
setattr(stu,'sex','男') #增加属性
delattr(stu,'sex') #删除属性
del stu.age #删除属性
构造函数和析构函数
class Student:
def __init__(self):
print("构造函数")
def __del__(self):
print("析构函数,销毁时调用")
操作符重载
class Student:
def __init__(self,name,score):
self.name=name
self.score = score
def __add__(self, other):
return self.score+other.score
def __sub__(self, other):
return self.score-other.score
s1 = Student('wang',60)
s2 = Student('li',70)
print(s1+s2) #自定义加法,输出130
断言测试
assertEqual(a, b) #核实a == b
assertNotEqual(a, b)
assertTrue(x) #核实x 为True
assertFalse(x)
assertIn(item , list ) #核实 item 在 list 中
assertNotIn(item , list )
进程休眠
import time
time.sleep(5)
正则表达式
更多详见我的其他博客: https://blog.youkuaiyun.com/wang342626/article/details/89099889
re.search(r'.','I love FishC.com')