《python从入门到实践》学习笔记
前言:大家好,这是我第一次写博客,嘿嘿,这篇学习笔记其实很久前就开始写了,因为我现在是大二,所以断断续续写了13小篇,把咱们博客园当作一个学习、存储和交流知识的space,觉得自己写一点东西记录下来是很美好的事情,于是就在今天发布了,也当是阶段性的总结吧。半个多月前我甚至还不知道markdown是啥,现在也开始是这慢慢使用这个功能强大的小家伙来写随笔写文章了,如果大家有什么好的学习使用Typora的教程愿意分享的话也可以发在这里交流交流哈,建议什么的也可以给我提呀(前提是有人看我写的哈哈哈)。这本书算是python入门级的良心书了,我在有一定基础的情况下读了其中绝大部分的内容并将自己觉得有必要记录下来的东西写在了每一天里,我在读书的过程中在vscode中运行的代码也附在了每一天最后,如果发现有什么错误疏忽一定要及时评论哦,我们可以相互学习!
本书配套网站:www.nostarch.com/pythoncrashcourse
day 1 基础学习
已安装python3.10
拥有一定python语法基础
根据书上内容进行实践
将字符串的字母大小写进行变换的方法
name.title()
name.upper()
name.lower()
table键:\t
删除字符串末尾和开头的空白
调用方法:rstrip(),lstrip
细节问题:如果字符串中必须包括一个单引号,用双引号引起来这个字符串
将整形数据转换成字符型:str()
列表
在某一位置添加元素,
调用方法insert(索引,元素)
删除:方法1:del(索引)
方法2:pop()(括号内不写东西删除的是末尾的元素,写索引则删除对应元素)
区别:pop后可以用来使用
方法3:remove()根据值删除【用法见程序】,只能删除第一个指定的值,如果该值出现多次则需要循环删除
永久排序:方法sort()实现按字母正反排序,永久性改变
#day1
name = "Abc deFg"
print(name.title()) #只大写首字母
print(name.upper())
print(name.lower())
delspace = " python "
print(len(delspace))
print(len(delspace.rstrip())) #删除尾巴
print(len(delspace.lstrip())) #删除头部
import this #python之禅
mylist = ["a","c","b","d","a"]
print(mylist)
mylist.insert(3, "z") #特定位置插入
print(mylist)
myletter = "a"
mylist.remove(myletter) #根据值删除特定元素
print(mylist)
print(myletter)
mylist.sort() #按字母永久排序
print(mylist)
mylist.sort(reverse=True) #倒序
print(mylist)
print(mylist)
sorted(mylist) #只写这句话不能实现临时按照字母顺序
print(mylist)
print(sorted(mylist)) #直接输出才行
print(mylist) #确实是临时的
day 2 列表
临时排序:sorted()
书中3.3.2介绍到sorted后按照字母倒序输出,需要给sorted传输参数reverse=True,但是编译mylist.sorted时会显示编译错误,sorted中必须为mylist否则无法保存第一部的结果,根据这个思路,可以另外新建一个列表来存储,然后用sort的方法进行对新的列表的永久排序然后用sort(reverse=True)来实现
倒着打印列表
具体调用方法:mylist.reverse()
确定列表长度:len(mylist)
实践提示:计算还剩下多少僵尸
一个列表有n个元素,索引随后一个元素mylist[-1]或者mylist[n-1]
for循环实践提示:初始化游戏——遍历角色列表,将每个角色都显示到屏幕上,循环后显示play now
数值列表,使用函数range()创建数字列表
乘方运算:**
tips:当使用临时变量时可以使代码可读性增强,审核时可以进行高效化的缩减
列表解析:将for循环和创建新元素的代码合并成一行,并自动附加新元素
复制列表,所用的知识为列表的切片,mylist[:]即不写开始结束的索引,直接将整个列表作为一个大切片
注意不能直接把mylist赋给新的列表,应当制作切片去传递
元组:不可变的列表
定义的时候使用()而不是[],索引的时候使用的和列表一样name[]
不允许对元组中的元素赋值
可以直接重新初始化该元组
#day2
mylist.reverse()
print(mylist) #直接按照原列表打印倒序
print(mylist[-1]) #索引最后一个元素
numbers = list(range(1,6)) #创建的是左开右闭
print(numbers)
even_num = list(range(2,11,2)) #第三个数可以指定步长
print(even_num)
构造完全平方数列表
square_num = []
for i in range(1,11):
temp = i**2
square_num.append(temp)
print(square_num)
square_num = [temp**2 for temp in range(1,11)] #列表解析
print(square_num)
dimensions = (5,3,7,11,9)
day 3 字典
if语句
检查是否相等:需要考虑字母大小写
如果为了实现不许分大小写,可以先将所有字母小写后做判断
检查一个元素是否在列表中:not in
字典
初始化字典:
访问字典中的值:
添加/删除:
修改字典中的值:(均见示例)
遍历所有的键值对(也可以单独便利)
6.4嵌套:可以使用字典列表,列表字典,字典字典
#day3
mydic = {"char1": "abc","char2": "def","char3": "ghi"}
print(mydic["char1"])
mydic["char2"] = "xyz"
print(mydic["char2"])
mydic["char4"] = "pqr"
del mydic["char3"]
print(mydic)
for key,value in mydic.items():
print(key)
print(value)
day 4 用户输入(1)
input函数:
工作原理:函数input()让程序暂停运行,等待用户输入一些文本。获取用户输入后存在一个变量中,以等待使用。
int()
可以将输入的字符串转换为整型数据
day 5 用户输入(2)
根据用户输入来决定是否结束程序的运行
while中运用字符串相等问题。
day 6 用户输入(3)
利用while循环,将人员的firstname lastname统计,并提供结束方式。90%自主完成,存在一个问题:每次只能存储一个人的信息进入字典,不过好像任务就是这个。本程序相当于结合了day4-6所学内容进行的程序编写,如下:
#day6
def get_ones_name(frn,ln):
fn = frn + " " + ln
return fn.title()
while True:
print("tell me your name , input 'q' to break")
frn = input("first name:\n")
if frn != 'q':
ln = input("last name:\n")
if ln != 'q':
age = input("your age:\n")
if age == 'q':
break
else:
break
else:
break
print("hello " + get_ones_name(frn, ln))
def buildname(frn,ln,age):
namedic = {'firstname: ': frn,'lastname: ':ln,'age: ': age} #这是一种封装方式
#if age:
#namedic['age'] = age #这是另一种封装方式,在函数定义中使用age = '',然后在调用时直接给其赋值在最开始的括号里面,成为一个实参
return namedic
print(buildname(frn, ln, age)) #注意本程序有一个小问题就是每次只能输入一个人的信息,如果输入多次只会记录最后一个人的信息。
day 7 形参与实参
传递任意数量实参方法:*形参名
意思为创建了一个以形参名命名的空元组,并将所有收到的值都封装到这个元组中
传递任意数量的关键字实参:**形参名
创建的是一个新的空字典(使用键值对,即调用语句提供了多少就使用多少)
调用模块:
import module_name
调用模块下的函数:
from module_name import function_name1,function_name2...........
调用模块下所有函数:
from module_name import * #正中情况下函数可以直接调用,不需要句点表示法
调用函数并起别名避免和程序中的名字重复:
from module_name import function_name as new_name
import module_name as new_name
这样一来调用的时候可以更加简洁:
new_name.new_name
day 8 类
类,对象,实例化。
面向对象编程是最有效的软件编写方法之一
创建类:
__init__(self,name,age)
类中的函数称为方法,init这个方法时一个__特殊且重要__的的方法,每当根据Dog类创建新的实例,Python都会自动运行它,开头末尾分别由两个下划线hi为了区别于其他的常用命名的函数。
在该方法的定义中,形参self必不可少,必须位于最前方。
self的作用:python调用者个方法时自动传入self实参,每个与类相关联的方法调用都用到实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。因为会自动传递,所以调用的时候只需要给其他形参赋值。
创建类中的实例:
my_dog = Dog('pp',3) #实例化对象
print(my_dog.name) #访问实例化对象的属性
想要修改内容,高级的方法是再写一个方法去调用以达到修改的目的:
def update_age(self,age): #又来改变年龄的方法
self.age = age
my_dog = Dog('pp', 3)
my_dog.update_age(23) #调用该方法
print(my_dog.age)
也可以通过创建方法来实现对某个属性累加
class Height():
def __init__(self,len):
self.len = len
def sum(self,len):
self.len += len
my_height = Height(180)
my_height.sum(3)
print(my_height.len)
下面是根据所学和自己想要实现的内容写出的代码:
#day8
class Dog():
def __init__(self,name,age): #小狗类的信息
self.name = name
self.age = age
def sit(self): #小狗执行坐下命令
print(self.name.title() + " is sitting now.")
def row_over(self): #小狗执行打滚命令
print(self.name.title() + " rowed over.")
my_dog = Dog('pp', 3)
print(my_dog.name)
print(f"给{my_dog.name}‘sit’指令或者‘else’指令看看它会怎么做:)\n(输入‘q’结束)")
giveorders = ''
while giveorders != 'q':
giveorders = input()
if giveorders == 'sit':
my_dog.sit()
elif giveorders != 'q':
my_dog.row_over()
day 9 类与子类
一个类继承另一个类:子类继承父类,继承原有并且可以定义自己的属性和方法
子类中有两个需要注意的:__init__()
和 super()
,下面的是继承的一个示例:
class Car(): #先定义好一个父类
def __init__(self,carname,caryear,carsize):
self.carname = carname
self.caryear = caryear
self.carsize = carsize
#创建子类时父类必须包含在统一个文件中
然后创建ElectricCar()子类:
class ElectricCar(Car): #这是想要继承父类的一个子类,定义子类必须要在括号内指出继承的父类是什么
def __init__(self,carname,caryear,carsize): #子类的__init__继承父类
super().__init__(carname,caryear,carsize) #super函数将父类与子类关联起来,这让python调用子类的父类方法__init__(),让子类实例化包含父类的属性父类也成为supercla,所以super因此得名。
若想改变父类下的方法,只需要在子类中重新定义即可。
day 10 文件
打开文件:
with open('python之禅.txt',encoding='utf-8') as file_object: #有汉字,需要对解码方式进行标注
contents = file_object.read()
print(contents)
逐行读取:
filename = 'python之禅.txt'
with open(filename) as file_object:
for line in file_object:
print(line)
#print(line.rstrip()) #消除每读取一行后的空行
写入空文件:
filename = 'programming.md'
with open(filename,'w') as file_object:
file_object.write('My name is LogyJ.')
open()函数中文件后的实参 :
'a'
附加模式
'w'
写入模式
'r'
读取模式
'r+'
读取和写入模式
day 11 异常
ZeroDivisionError
异常:python不能除以0
try-expect-else的使用:
try:
answer = n / m
expect ZeroDivisionError:
print("You can't divide by zero!")
#pass #如果希望程序不做出错误的汇报
else:
print(answer)
#如果try中的代码运行没有出错则跳过expect代码块运行接下来的程序,如果出错则运行expect中的代码,这样可以避免用户看到traceback从而提高程序出错的可读性和安全性。
通过预测可能发生错误的代码,可编写健壮的程序,即便面临无效数据或缺少资源也能继续运行,从而能抵御无意的用户错误和恶意的攻击。
day 12 数据存储
存储数据:json
模块(JavaScript Object Notation
)
常用的两个方法:
import json
numbers = [2,3,5,6,7]
filename = 'number.json'
with open(filename,'w') as f_obj:
json.dump(numbers,f_obj) #使用json.dump存储数据,需要传入两个参数
with open(filename) as f_obj:
numb = json.load(f_obj) #使用json.load读取存储的数据
print(numb)
day 13 测试代码
测试函数的一个例子:
def get_formatted_name(first,last):
full_name = first + ' ' + last
return full_name.title()
提示:使用模块unittest中的工具为函数和类编写测试
后记:从某种意义上这就是半个月的python学习成果了,本书接下来的部分是几个项目的实践,我也会记录下来每天的进展和遇到的问题和解决方法,到时候继续发表出来和大家一起交流!冲冲冲!