《python从入门到实践》学习笔记
[TOC]
本书配套网站:[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中的工具为函数和类编写测试