python基础
代码风格
- 不要在行尾加分号, 也不要用分号将两条命令放在同一行(长命令除外)
- 类名:单词首字母大写,如:SampleClass
- 库的导入,从上至下为:
- 标准库导入
- 第三方库导入
- 应用程序指定导入
- 程序入口
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('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