本文章旨在记录本人python基础语法学习的回顾总结。知识点来自B站莫烦python的python基础教程
python入门笔记
python的安装
下载链接 按需下载噢,建议直接下载3.5以上的版本,不推荐2.X版本
- macOS下的安装:直接一直点下一步即可
- windows下的安装:点下一步即可,记得勾选“添加到command line…..”的那个选项噢(否则无法正常使用pip3)
- linux下的安装:转载一篇博客
安装完成后进入命令行输入python3 显示如下界面:
print函数
直接上代码吧 比较浅显易懂
say_hi = "Hello World"
print("你的第一行代码:", say_hi)
输出结果:
你的第一行代码: Hello World
有关数学符号
在数学里,“=”就是等于的意思 但是在编程环境中“=”就是赋值的意思,比如sa y_hi = "Hello World"
就是把“Hello World”这个值赋值给名为say_hi的变量。在编程环境中的“==”符号,才是用来判断是否相等的,比如123==321
就会返回一个False值 QWQ!
还要记得在python里//相当于整除,%相当于取余数噢
自变量variable
python不用定义类型,可以直接定义变量
apple = 1
print(apple)
APPLE_EGG = 11
appleEgg = 12 + 3
print(appleEgg)
如同第二节里的say_hi 一样,apple和say_hi都是变量的名称,定义变量的方式就是如此
关于循环与判断
- while循环
#while循环
num1 = 3
while(num1 <= 8):
print("现在num的值为:",num1,"num自增1!")
num1 = num1 + 1
运行结果:
现在num的值为: 3 num自增1!
现在num的值为: 4 num自增1!
现在num的值为: 5 num自增1!
现在num的值为: 6 num自增1!
现在num的值为: 7 num自增1!
现在num的值为: 8 num自增1!
- for循环
#迭代遍历
a_list = [1,2,3,4,5]
for i in a_list:
print(i)
#使用下标遍历
for j in range(len(a_list)):
print(a_list[j])
# 关于range:range(1,3) --> 1 2 (左闭右开) len(a_list)就是返回a_list这个list的长度
运行结果:
- enumerate()函数
Python 的 enumerate() 函数就像是一个神秘的黑箱,你无法简单地用一句话来概括这个函数的作用与用法。
enumerate() 函数属于非常有用的高级用法,而对于这一点,很多初学者甚至中级学者都没有意识到。这个函数的基本应用就是用来遍历一个集合对象,它在遍历的同时还可以得到当前元素的索引位置。
names = ["Alice","Bob","Carl"]
for index,value in enumerate(names):
print(f'{index}: {value}')
'''
0: Alice
1: Bob
2: Carl
'''
有很多从C或Java背景转过来的新的Python开发人员有时使用下面这种range(len(…))方法来保存运行中每个元素的索引,同时再用for循环遍历列表:
# 警告: 不建议这么写
for i in range(len(my_items)):
print(i, my_items[i])
通过巧妙地使用enumerate()函数,就像我在上面的“names”例子中写的那样,你可以使你的循环结构看起来更Pythonic和地道。
你不再需要在Python代码中专门去生成元素索引,而是将所有这些工作都交给enumerate()函数处理即可。这样,你的代码将更容易被阅读,而且减少写错代码的影响。(译者注:写的代码越多,出错几率越高,尽量将自己的代码看起来简洁,易读,Pythonic,才是我们的追求)
另一个有用的特性是,enumerate()函数允许我们为循环自定义起始索引值。enumerate()函数中接受一个可选参数,该参数允许你为本次循环中的计数器变量设置初始值:
names = ["Alice","Bob","Carl"]
for index,value in enumerate(names,1):
print(f'{index}: {value}')
'''
1: Alice
2: Bob
3: Carl
'''
##这段代码演示的就是如何将Python的enumerate()函数默认0起始索引值修改为1
- if,if else,if elif else
inin = int(input("请输入一个数字"))
if inin < 0:
print("这个数字小于0")
elif inin == 3:
print("这个数字等于3")
else:#else是相对于if来说的
print("这个数字大于等于0且不等于3")
运行结果:
使用def定义函数
def fun(a,b):
# a,b为参数 函数可以有返回值也可以没有噢
c = a+b
print(3)
#可以通过运行结果看到调用的顺序
return c
print(fun(2,3))
运行结果:
3
5
- 函数默认参数
def fun1(a,b=30,d=20):
#可以设置函数的参数为默认值,未写明的调用就直接用定义好的调用值
print(a,b,d)
#请注意未定义好初始值的变量不能在已经定义好初始值的变量后面
fun1(1)
fun1(1,b=2,d=3)
运行结果:
1 30 20
1 2 3
全局变量&局部变量
APPLE = 100
a = None
def fun():
global a
#不加global a就会None
a = 20
global b
b = 120
'print(a)'
return a+103
print('past a:',a)
print(fun())
print(b)
print("later a:",a)
#通过添加global,使原来是局部变量作用域的变量变为全局变量
运行结果:
past a: None
123
120
later a: 20
模块安装
- macOS/Linux下的模块安装:使用终端里的iterm即可:
- Windows下的安装:去官网下载
读写文件
- 创建一个文件并向其写入一些文字
text = "This is my first test.\nThis is next line.\nThis is last line"
#\n代表回车,在文件中就相当于输入一个句子换行
print(text)
my_file = open('my file.txt','w')
my_file.write(text)
my_file.close()
#open函数第一个参数是要打开的文件的文件名,第二个参数是打开方式,w代表写,r代表只读,如果以w方式打开不存在的文件则会直接创建新文件,编辑完文件记得使用close方法保存文件
- 使用append打开方式(a)向文件末尾添加文字
append_text = "\nThis is appended file."
#a的意思是append
my_file = open("my file.txt",'a')
my_file.write(append_text)
my_file.close()
- 读取文件并print
file = open("my file.txt",'r')
#content = file.read()
#readline是一行一行读
content = file.readlines()
for i in content:
print(i)
second_read_time = file.readline()
print(content,second_read_time)
print(content)
file.close()
运行结果:
This is my first test.
This is next line.
This is last line
This is appended file.
This is appended file.
['This is my first test.\n', 'This is next line.\n', 'This is last line\n', 'This is appended file.\n', 'This is appended file.']
['This is my first test.\n', 'This is next line.\n', 'This is last line\n', 'This is appended file.\n', 'This is appended file.']
类 class
类的定义:
一般类名首字母大写 再跟上冒号,比如这样:
class Calculator:
name = "Casio Calculator"
price = "199"
#self是类内函数默认参数 self就是类本身 类似与java中的this
def add(self,x,y):
print(self.name)
result = x + y
print(result)
def minus(self,x,y):
result = x - y
print(result)
def times(self,x,y):
result = x * y
print(result)
def divide(self,x,y):
result = x / y
print(result)
在类里可以定义属性,也可以定义类中的函数,但注意类中的函数参数列表的第一个参数必须是self,self类似于java对象中的this指针
- 类的实例化及调用:
#类的实例化
cal = Calculator()
#类中的元素
cal.name
#类中的方法
cal.add(1,2)
- 类的__init__方法
class Calculator:
#name = "Casio Calculator"
#price = "199"
def __init__(self,name,price,height,width,weight):
#init这个函数类似java中类的构造函数,但是类中的元素不像java需要提前定义好 类在初始化时会自动执行__init__()函数QWQ!
print('!!!initinit!!!')
self.name = name
self.price = price
self.h = height
self.wi = width
self.we = weight
#self是类内函数默认参数 self就是类本身 类似与java中的this
def add(self,x,y):
print(self.name)
result = x + y
print(result)
def minus(self,x,y):
result = x - y
print(result)
def times(self,x,y):
result = x * y
print(result)
def divide(self,x,y):
result = x / y
print(result)
输入
a_input = input('Please give me a number:') #return a string so it equals '1' not equals 1
if a_input=='1':
print("this is a good one")
elif a_input=='2':
print("see you next time")
else:
print("FKU!")
b_input = int(input('Please give me a b number:')) #return a string so it equals '1' not equals 1
if b_input==1:
print("this is a good one")
elif b_input==2:
print("see you next time")
else:
print("FKU!")
运行结果:
Please give me a number:1
this is a good one
Please give me a b number:3
FKU!
请注意,python3中的input,默认输入的是字符串,记得转格式再使用
元组&列表&字典
- 元组(tuple)
元组tuple最大的特征是内容不可变,因此使用频率低,一般常用List
- 列表(List)
列表是我们最常用的一种存储数据机制。它就像一个抽屉一样,存放着各种信息,每一格都是一个存储单元,每一格都可以单独获取。
files = ["f1.txt", "f2.txt", "f3.txt", "f4.txt", "f5.txt"]
print("files[0] ", files[0])
print("files[3] ", files[3])
print("files[-1] ", files[-1])
print("files[-3] ", files[-3])
运行结果
files[0] f1.txt
files[3] f4.txt
files[-1] f5.txt
files[-3] f3.txt
在列表中,既然你已经把东西按顺序存放到抽屉中了,那你就可以按照顺序拿到你存放的东西。 在Python中,我们将上面的数字号叫做 index 索引。现实中第1个位置的东西,在Python中,是第0位。 所以Python的第一个索引永远都是 0。 除了正着来取东西,我们完全也可以反着来取东西,第一个反着取的序号是 -1。以此类推,-3 这个索引就是倒着数第三个。
而且在Python中,还很方便的可以一次性拿到多个抽屉的结果。比如下面我们就来演示一下取从多少位到多少位的东西。
print("files[:3] ", files[:3])
print("files[2:4] ", files[2:4])
print("files[-3:] ", files[-3:])
运行结果:
files[:3] ['f1.txt', 'f2.txt', 'f3.txt']
files[2:4] ['f3.txt', 'f4.txt']
files[-3:] ['f3.txt', 'f4.txt', 'f5.txt']
在列表中,你可以存放不同类型的元素,字符,数字,甚至列表里还能有列表。
- 多维List
a=[1,2,3,4,5]
multi_dim_a=[[1,2,3],
[2,3,4],
[3,4,5]]
print(a[0])
print(multi_dim_a[0][2])
运行结果:
1
3
- 字典(dictionary)
key->value 一一对应 这里的key对应的就是list中的index哦!这个字典中的 key 都是唯一的,如果你的抽屉出现了重名,我相信你应该也不知道到底是哪个抽屉放着想要找的东西吧。 而 value 是多样的,你可以放一个字符,一个数字,甚至一个列表,甚至是另一个字典。当你想要索引的时候,用 key 就能找到里面的内容。同列表,字典也是可以修改的。
a_list = [1,2,3,4,5,4]
d = {'apple':1,'pear':2,'orange':3}
d2 = {1:'abandon',2:'bear','c':'ciliba'}
print(d2[1])
print(a_list[0])
#删除字典元素 del
print(d)
del d['orange']
print(d)
#添加元素的话直接定义就行
print(d)
d['b'] = 20
print(d)
#字典里也可以加字典 function
dd = {'apple':1,'pear':{1:3,3:'a'},'orange':3}
print(dd['pear'][3])
运行结果:
abandon
1
{'apple': 1, 'pear': 2, 'orange': 3}
{'apple': 1, 'pear': 2}
{'apple': 1, 'pear': 2}
{'apple': 1, 'pear': 2, 'b': 20}
a
模块
- 载入模块
可以使用import 模块名
来载入模块,也可以用import time as t
使t成为被引入模块time的别名,方便调用。如果只想使用一个模块中的部分功能:from time import time,localtime
,其中time,localtime就是time模块中的两个方法名。也可以使用from引入模块中的所有方法,引入后调用方法无需输入方法前的模块名,如from time import *
- 自定义模块
自己编写的.py文件和当前在编码的文件同路径时,直接使用import引入即可,或者把自己编写的.py文件复制/移动到python系统下载其他模块的默认目录中也可以。
continue&break
- 在没有continue,break时:
a = True
while a:
b = input('type sth:')
if b=='1':
a = False
else:
pass
print("finish running")
- 有break时
while True:
b = input('type sth:')
if b=='1':
break
else:
pass
print("still in while")
print("finish running")
- 有continue时 continue跳过循环范围内的的后续代码:else … print… 从而不输出still in while
while True:
b = input('type sth:')
if b=='1':d
continue
else:
pass
print("still in while")
print("finish running")
错误处理try
- 没有try时
file = open('eee.txt','r')
#如果文件名输入错误,或者文件不存在时会直接报错,影响程序后续执行
- 使用try
filename = input('input file name:')
try:
file = open(filename,'r+')
# 捕获错误
except Exception as e:
print('there is no file QWQ')
response = input('do you want to create a new file?(y/n)')
if response == 'y':
file = open(filename,'w')
else:
pass
else:
#如果try成功了
file.write('aaa')
file.close()
使用lambda,zip,map
map 分两部分 功能和参数合起来,lambda相当于简化的功能/函数,zip是迭代器所需要的东西,直接上代码:
a = [1,2,3]
b = [4,5,6]
#zip是把a和b竖向合并
zip(a,b)
#zip返回值是一个功能
ll = list(zip(a,b))
print(ll)
##[(1, 4), (2, 5), (3, 6)] 此为print(ll)的结果
for i,j in zip(a,b):
print(i/2,j*2)
## 0.5 8
## 1.0 10
## 1.5 12
#能否zip更多元素?
lll = list(zip(a,a,b))
print(lll)
##[(1, 1, 4), (2, 2, 5), (3, 3, 6)] 此为print(lll)的结果
#lambda:
# 未使用lambda
def fun1(x,y):
return(x+y)
print(fun1(2,3))
## 5
# 使用lambda 可提高代码可读性
fun2 = lambda x,y:x+y
print(fun2(2,3))
## 5
#map
#把已知的功能加上所要给的参数一起输入运算 是一个object
print(list(map(fun1,[1],[9])))
## [10]
print(list(map(fun1,a,b)))
## [5, 7, 9]
深复制&浅复制
浅复制与深复制的区别:浅拷贝,拷贝父对象不会拷贝子对象,深拷贝的话完全拷贝父及子对象
import copy a = [1,2,3] b = a #id是在硬盘中的索引 print(id(a)) print(id(b)) b[0]=11 print(a) a[0]=12 print(b) #改变a的值,b也跟着变 print(id(a)==id(b)) #浅复制 只复制值 不复制地址 c = copy.copy(a) print(id(a)==id(c)) c[1]=22222 print(a) print(c) d=[1,2,[3,4]] e = copy.copy(d) print(id(d)==id(e)) print(id(d[2])==id(e[2])) #True d[0] = 11 print(d) print(e) d[2][0] = 333 print(d) print(e) #所以浅复制的list中的list是无法幸免的 还是会被同步 e = copy.deepcopy(d) print(id(d[2])==id(e[2])) #False #list表有单独索引,这个不一样。但是表内元素索引一样的,说明都指向那个元素,感觉空间节省了。
pickle存放数据
可以使用pickle保存一些你之后想再次利用的数据,以二进制形式保存噢,后缀名一般为.pickle。
- 保存数据
import pickle
#可以在你想保存运算结果时做到保存和提取的功能
a_dict = {'da':111,2:[23,1,4],'23':{1:2,'d':'sad'}}
file = open('pickle_example.pickle','wb')
#dump()函数!!file的后缀名记得是.pickle哦
pickle.dump(a_dict,file)
file.close()
- 从.pickle文件中读取数据
with open('pickle_example.pickle','rb') as file:
#使用with开头的这个句子不用file.close()诶 好神奇qwq!
#file = open('pickle_example.pickle','rb')
a_dict1 = pickle.load(file)
print(a_dict1)
#file.close()
使用set来找不同
char_list = ['a','b','c','c','d','d','d']
print(set(char_list))
#{'a', 'c', 'b', 'd'}
print(type(set(char_list)))
#<class 'set'>
print(type({1:2}))
#<class 'dict'>
sentence = 'Welcome Back to This Tutorial'
print(set(sentence))
#{'T', 'W', 'h', 'i', 'r', 'o', 'm', 'a', ' ', 'u', 'e', 'c', 'B', 't', 'l', 's', 'k'}
#print(set([sentence,char_list])) 会报错 不能传列表+列表的形式
unique_char = set(char_list)
unique_char.add('x')
print(unique_char)
#{'b', 'a', 'x', 'd', 'c'}
#unique_char.add(['a','x']) 也错了捏
#可以减东西吗?qwq
unique_char.clear()
print(unique_char)
#单独去除东西呢?
unique_char.remove('x')#返回值为None哦 打印出的结果就是None
print(unique_char)
#{'a', 'c', 'd', 'b'}
#如果remove一个不存在的元素,就会报错 所以使用discard()
print(unique_char.discard('y'))
print(unique_char)
#比较两个set set1={'b', 'a', 'x', 'd', 'c'} set2 = {'a','e','i'}
set1 = unique_char
set2 = {'a','e','i'}
print(set2.difference(set1))
#{'e', 'i'} differece是做差 不具备可交换性
print(set1.difference(set2))
#{'x', 'b', 'd', 'c'}
print(set1.intersection(set2))
#{'a'} intersection为取交集
print(set2.intersection(set1))
#{'a'}
RegEx 正则表达
请参考这个链接