目录

python基础

代码风格

  1. 不要在行尾加分号, 也不要用分号将两条命令放在同一行(长命令除外)
  2. 类名:单词首字母大写,如:SampleClass
  3. 库的导入,从上至下为:
    1. 标准库导入
    2. 第三方库导入
    3. 应用程序指定导入
  4. 程序入口
if __name__ == '__main__':  
    main()

__name__ 是当前模块名,当模块被直接运行时模块名为 __main__ 。
这句话的意思就是,当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行。

输入input与输出print

input

str_input = input('please input a string:')
input的返回值是字符串想要输入数字需要用int或float强制转换
num_input = input('please input a number:')
print('this is input number:', float(num_input))

print

引号问题
print('we are human')   #输出字符串时,若字符串中无单引号则用双引号或单引号输出都行
print("we're human")    #若字符串中包含单引号,则需要用双引号输出或用转义字符\
print('we\'re human')   #若字符串中有单引号则推荐用双引号输出,若字符串中有双引号则推荐用单引号输出
print("we\'re human")   #其他情况则使用转义字符
其他
print('apple'+'car')   #applecar
print(1+2)             #3
print('apple'+str(4))  #apple4
print(int('1')+2)      #3
print(int('1.2')+2)    #错误
print(float('1.2')+2)  #3.2
逗号分隔
print(1,2,3)           #1 2 3
print('haha', 12)      #haha 12
                       #每个输出以空格分隔
print自动换行

运算符

 +   -   *     /           //            **    %
#加  减  乘  除(保留小数)  整除(舍去小数)  次幂  取余
2**3   #2的三次幂

变量

a=2    #直接定义使用

a,b,c = 1,2,3   #可以连续定义
print(a,b,c)    #输出为1 2 3

#全局与局部   global的用法
#全局变量用大写表示,局部用小写加下划线
a = 10
def fun():
    global a    #将a当作全局变量使用
    a = 20
print(a)        #10
fun()
print(a)        #20

循环语句

while循环

condition = 1
while condition < 10:
    print(condition)
    condition += 1   #python不支持自增运算符++

while True:
    pass          #无限循环

for循环

list = [1,2,3,4,5]  #列表,相当于数组
for i in list:
    printf(i)

for letter in 'Python':
    print(letter)     #P y t h o n

for i in range(1,5):  #常用
    print(i)          #1 2 3 4因为range是左闭右开函数,range(1,5)相当于[1,5)

条件语句

if x<y>=z:     #python可以连续比较
    pass
elif x>y:
    pass
else:
    pass

def函数

def functionName(a,b):
    print(a+b)           #在python中用缩进而不用{}

#默认参数
def fun(a,b=2,c=3):  #定义默认参数从后向前定义
    pass
fun(1,5)             #赋值使用时从前向后

外部模块安装

pip3 install numpy    #安装numpy外部模块
pip3 uninstall numpy  #卸载
pip3 install -U numpy #升级

文件读写

text='This is a test'
文件创建与写入
my_file = open('test.text','w')  #打开文件test.text,以写入方式打开,若无文件则自动创建
my_file.write(test)  #写入内容
my_file.close()      #关闭文件

追加文字
my_file = open('test.text','a')
my_file.write(test)  #写入追加内容
my_file.close()      #关闭文件

读取文件
my_file = open('test.text','r')
content = file.read()   #读取文件内容
print(content)
my_file.close()      #关闭文件

读取一行或多行
my_file = open('test.text','r')
content = file.readline()   #只读取文件一行的内容,若之前已经进行过readline,则这次会读取下一行
contents = file.readlines()   #以行为单元读取文件所有内容,内容会以列表形式保存在名为contents的列表中

class类

class Calculator:      #类的命名开头最好大写
    name = 'calculator'
    price = 18
    def add(self, x, y): #类中定义的函数方法必须要有self参数,并且放在第一个位置
        return x+y
    def print_price(self):
        print(self.price)
cal = Calculator()   #实例化,创建cal对象 c++中是cal = new Calculator()
print(cal.add(1,2))
cal.print_price()

类的init方法

init()方法相当于C++中的构造函数,self相当于this

class Calculator:      
    #name = 'calculator' #有了__init__()就不需要定义变量了,所以非常推荐在class类中使用__init__()函数
    #price = 18
    def __init__(self, name, price):
        self.name = name
        self.price = price
    def print_price(self):
        print(self.price)

元组、列表、字典、集合

列表与元组

a_tuple = (1,2,3) , another_tuple = 4,5,6
a_list = [7,8,9]
元组和列表在结构上没有什么区别,唯一的差异在于元组是只读的,不能修改,元组用“()”表示

for i in a_list:
    print(i)
for i in range(len(a_list)):
    print(a_list[i])
a_list.append(10)    #[7,8,9,10] 在列表后追加元素
a_list.insert(1,11)  #[7,11,8,9,10] 在指定位置插入元素
a_remove(11)         #[7,8,9,10] 删除列表中值为11的元素,若有多个,则删除第一个,再次执行则删除下一个
print(a_list[-1])    #10  -1代表最后一个元素
a_list[0:3]          #列表前三个元素,即7,8,9,[]是闭开区间
a_list.index(8)      #列表中第一次出现8的索引值
a_list.count(2)      #列表中出现2的次数
a_list.sort()        #默认从小到大排序,并且覆盖原先列表
a_list.sort(reverse=True) #从大到小排序,并且覆盖原先列表

多维列表

multi_list = [[1,2,3]
              [4,5,6]
              [7,8,9]]  #二维列表

字典

无顺序,乱序排列

d1 = {1:'a', 2:'b', 3:'c'}
d2 = {'a':1, 'b':[6,7], 'c':3}
del d1[1]     #{2: 'b', 3: 'c'}删除元素
d1[4:'c']     #添加元素

集合

list1 = [1,2,2,3,3,5,4,4,]
set1 = set(list1)
print(set1)   #{1,2,3,4,5}  剔除重复的元素,不过结果为乱序

#还可以对字符串进行set
sentence = 'Welcome Back to This Tutorial'
print(set(sentence)) #{'B', 'm', 'a', 'i', 's', 'W', 'e', 'T', 'h', 'u', 'c', ' ', 'k', 't', 'o', 'l', 'r'}

#向集合中添加元素
set1.add('a')
#移除元素
set1.remove('x')  set1.discart('x')
#清空集合
set1.clear()
#集合set1差上set2  差集
set1.difference(set2)
#交集
set1.intersection(set2)

模块

载入模块

import time  #导入整个time模块
print(time.localtime())

import qwerttyuio as q #若模块名非常长,可用此方式简化

from time import time,localtime #从time模块中导入time和localtime功能,而不是导入整个time模块
print(localtime())  #不用time.localtime,直接使用localtime即可

from time import *  #导入time模块中所有功能,使用也是直接使用即可,即localtime(),无需time.localtime()

导入自己的模块

若自己在module.py文件中有一个printdata()函数,想要在另一个python文件中使用,那么需要将两个文件放入同级目录,然后写入from module import printdata

错误处理

例如当读取一个不存在的文件时会发生错误,程序中断允许,为了处理这种情况,可以使用try语句来处理错误,从而使程序正常运行

try:
    file = open('ewe.txt','r')
except Exception as e:             #e为错误信息
    print('there is no such file')  #相应的错误处理
else:
    str = file.readline()  #无错误则执行else

zip lambda map

zip

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。
我们可以使用 list() 转换来输出列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表

>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b)     #返回一个对象
>>> zipped
<zip object at 0x103abc288>
>>> list(zipped)  # list() 转换为列表
[(1, 4), (2, 5), (3, 6)]
>>> list(zip(a,c))          #元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
 
>>> a1, a2 = zip(*zip(a,b)) #与zip相反,zip(*)可理解为解压,返回二维矩阵式
>>> list(a1)
[1, 2, 3]
>>> list(a2)
[4, 5, 6]

lambda

python 使用 lambda 来创建匿名函数。所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。

  • lambda 只是一个表达式,函数体比 def 简单很多。
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
  • lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
  • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
def func1(x,y):
    return x+y

func2 = lambda x,y:x+y

map

map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

>>>def square(x) :            #计算平方数
...     return x ** 2
... 
>>> map(square, [1,2,3,4,5])   #计算列表各个元素的平方
[1, 4, 9, 16, 25]
>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5])  #使用 lambda 匿名函数
[1, 4, 9, 16, 25] 
#提供了两个列表,对相同位置的列表数据进行相加
>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]

copy与deepcopy

a = [1,2,3]
b = a
id(a)      #id()函数用来插卡变量在硬盘中的位置
id(b)      #两次id()的结果一样,可看出copy只是起了个别名
b[0] = 11
print(a)   #[11,2,3] 故改变任何一个的值(如改变b的值),则其他的也一起改变(如a的值)
import copy
a = [1,2,[3,4]]
b = copy.copy(a)
#第一层列表完全拷贝,第二层列表只是起了个别名

c = copy.deepcopy(a)
#完全拷贝,在内存中独占一份

pickle模块

pickle可将未处理完的数据进行保存,待下次继续处理

import pickle
a_dict = {'a':111, 2:[1,2,3], '23':{1:2, 'b':'b'}}
#存储
file = open('example.pickle', 'wb')
pickle.dump(a_dict,file)
file.close()
#提取
file = open('example.pickle','rb')
a_dict = pickle.load(file)
file.close()
#打开文件可用with as简化,用with打开文件不用手动close关闭
with open('example.pickle','rb') as file:
    a_dict = pickle.load(file)

日志logging

LOG_FORMAT = '%(asctime)s [%(levelname)s]: %(message)s'
formatter = logging.Formatter(LOG_FORMAT)
logger = logging.getLogger()
logger.setLevel(logging.INFO)

# 日志输出到字符串
log_stream = StringIO()
str_out = logging.StreamHandler(log_stream)
str_out.setFormatter(formatter)
str_out.setLevel(logging.INFO)
logger.addHandler(str_out)

# 日志输出到标准输出
std_out = logging.StreamHandler(sys.stdout)
std_out.setFormatter(formatter)
std_out.setLevel(logging.INFO)
logger.addHandler(std_out)

# 写日志
logging.info('log...')

正则表达式

首先看一下python本身对字符串的处理,python只能在给定的字符串中查看是否存在目标字符串,功能较弱

if str1 in str2:
    print(str1)

用正则表达式处理

具体参考以下链接:
https://www.runoob.com/python3/python3-reg-expressions.html
https://docs.python.org/zh-cn/3/library/re.html