《Python从入门到实践》学习笔记
第二章、变量和简单的数据类型
1.修改字符串的大小写
name = headongname = name.title()print(name)#title()函数,把单词的首字母变成大写#将所有的字符串变成大写print(name.upper())#将所有的字符串变成小写print(name.lower())
2.制表符和换行
- 制表符tab:\t
- 换行符:\n
3.删除空白
strip():删除字符串开头和末尾多余的空白
#strip()删除字符串开头和末尾多余的空白#lstrip()删除开头的空白#rstrip()删除末尾的空白
第三章、列表
1.修改列表中的元素
- 在列表中插入元素
#列表名.insert(要插入的位置,元素的内容)he = ['a','b','c']he.insert(0,'d')print(he)
删除列表元素
方法一:删除指定所以的元素
- del 列表名[索引]
方法二:出栈——将列表末尾的元素移除并作为返回值返回
- 列表名.pop()
方法三:删除列表的指定元素
- 列表名.remove(指定元素)
- ==注意:==我们使用完remove函数后,该元素后面的所有元素索引-1
```python
一、del 列表名(索引)
del he[0]
二、使用pop()将列表末尾的元素弹出(返回值是列表末尾的元素)
moto = [‘honda’,’yama’,’suzuki’] print(moto) popped = moto.pop() print(moto) print(popped)
<a name="695ce77e"></a>#### 2.排序> - 将列表中的元素按照首字母表排序> ```python#列表名.sort()
- 按照与字母顺序相反的序列排列
#列表名.sort(reverse = True)
- 按照特定的顺序呈现列表,但是保持原来的索引序列
car = ['bmw','audi','toyota','subaru']print('这是最开始的列表的样子!')print(car)print('这是使用临时该表列表顺序后的样子!')print(sorted(car))print('再看看列表的序列有没有改变')print(car)
sorted()
- 将列表中的元素的索引序列颠倒(与元素的内容无关,只是单纯将现在的列表反转)
3.确定列表的长度
len(列表名)#有几个元素就会输出几
4.索引-1代表列表的最后一个元素
第四章、操作列表
- 使用range()创建数字列表
- range()函数可以设置步长
```python
list()函数:将其括号里的参数转化为列表
number = list(range(1,6))
使用range()设置步长
从2开始数,不断加3,知道达到或者超过11S
number = list(range(2, 11, 3))
> - 找到列表里最大的元素,最小的元素,列表元素的总和> ```pythondigits - [1, 2, 3, 4, 5, 6]min(digits)max(digits)sum(digits)
```python squares = [value**2 for value in range(1,11)]
上面的式子等价于
squares = [] for value in range(1, 11): squares.append(value**2)
<a name="bae4c5a3"></a>### 1.列表的切片> ```pythonprint(player[1, 4])#这个切片最终输出的元素为索引1~3的元素#注意:1.包前不包后# 2.如果没有指定索引则默认从开头开始# 3.如果没有指定后面的元素,同理print(player[:4])
2.复制列表
复制列表的方法:
使用==[:]==(切片)
my_food = ['pizza','falafel','carrot cake']friend_food = my_food[:]my_food.append('豆浆')friend_food.append('胡辣汤')print(friend_food)print(my_food)
为什么不能用原列表直接赋值给新的列表?
- 直接赋值知识将新列表名同时指向了同一个列表
- 没有将旧列表的副本存储到新列表中
3.元组
- 我们不能修改元组的元素
- 如果要修改元素元素的话,只能给元组重新赋值
4.设置代码格式
第五章、if语句
- 单等号和双等号的区分
```python
一个等号代表陈述:将变量car的值设置为’audi’
car = ‘audi’
两个等号表示发问:变量car的值是’bmw’吗?
car == ‘bmw’
> - 双等号检查时,会区分大小写<a name="c7cc766d"></a>## `六、字典`> - 往字典里面添加元素> ```pythona = {}a['color'] = 'green'a['number'] = 10print(a)
- 删除键值对
del a['color']#使用del语句直接删除该键值对
一、遍历字典
Python有三种遍历字典的方式
- 遍历键——值对
- 遍历键
- 遍历值
1、遍历键——值对
- 使用for循环来遍历列表
```python user = { ‘username’:’efermi’, ‘first’:’enrico’, ‘last’:’fermi’ }
下面是遍历的代码
for key, value in user.items(): print(“\nKey:” + key) print(“Value:” + value)
> - items()> - `返回:`返回一个键值对列表> - ==注意:==for后面的也是两个变量,这两个变量的名字可以根据我们具体的使用环境来具体定义<a name="25e1b902"></a>#### 2、遍历字典中所有的键> ```pythonuser = {'age':12,'favourite':'basketball','fruit':'apple'}#依次返回字典的键,并把这个键保存到变量name中for name in user.keys():print(name.title())
- keys()
返回:这个函数只返回字典的键(这些键组成了一个列表),而不返回值(只有字典才可以被for循环所遍历)
3、遍历字典中所有的值
values()
返回:这个函数只返回字典的值(这些值组成了一个列表)
4、set集合
什么是集合(set):集合类似于列表,但是每个元素都必须是独一无二的
- set()函数:对一个列表使用set()函数,返回一个每隔元素都不会重复的列表
- 作用:对列表中的元素进行去重
二、嵌套
什么是嵌套:
将一系列字典存储在列表中,或者将列表存储在字典中,就叫做嵌套。
1、字典存在列表
什么时候需要把列表存在字典中?
- 列表中需要包含很多个字典,并且这些字典的结构很类似(都拥有相同的键但不同的值)
- 比如游戏中的障碍物(他们都要不断出现,并且拥有类似的结构)
- 比如在网页中要创建一个用户列表
2、列表存在字典
什么时候需要把列表存在字典中?
- 当需要在字典中将一个键关联到多个值时,在字典中嵌套一个列表。
3、在字典中存储字典
什么时候使用在字典中存储字典?
- 当我们要存储多个不同id用户的信息,这些用户还有着相同的属性结构时使用
users = {'张三':{'爱好':'basketball','性别':'男','地址':'西安'},'李四':{'爱好':'sing','性别':'女','地址':'西安'}}
4、
laoda = {'zhuren':'zhangsan','maose':'yellow'}laoer = {'zhuren':'lisi','maose':'green'}pets = [老大,laoer]for pet in pets:print('毛色是'+pet['maose']+'的pet,它的主人是'+pet['zhuren'])
第七章、用户输入和while循环
一、函数input( )
参数:
input()只接受一个参数,就是让用户可以看见的,提醒用户输入的话。
如果要提示用户的话比较长,或者分为几行?
把要展示的内容存储在变量中
prompt = '这是第一行。'prompt += '\n你要输出啥呢?'
+Python将用户的输入识别为字符串
- 如果想输入数字,并且数据类型也为整型怎么办?
- ==int()==函数将输入转化为整型
二、使用while循环
- 一定要避免死循环
三、使用标志切换程序状态
prompt = '程序要quit还是打印别的东西呢?'active = True#在下面这个循环中,当我们输如quit时,active的状态被修改成了False,这是退出while循环while active:message = input(prompt)if message == 'quit':active = Falseelse:print(message)
四、break和continue
1、break语句
退出当前循环(应该是退出距离break最近一层的循环)
2、continue语句
#完成功能:从1输出到10,但是,只输出其中的奇数,不输出偶数current_number = 0while current_number < 0:current_number += 1if current_number % 2 == 0:continueprint(current_number)
- continue语句执行后,循环中continue后面的代码不再执行,直接跳过,返回到循环开始
- 在上面的例子中:当current_number为2时,第六行执行,第7行直接背跳过,回到循环开始
习题
7-4
message = '请您输入您所需要的配料:'message += '\n要退出输入,输入quit即可'active = Truewhile active:food = input(message)if food == 'quit':print('输入结束')active = Falseelse:print(food)
五、用while循环来遍历列表和字典
while 列表:循环体
原则:
- 当列表不为空时,while循环一直执行
- 当列表为空时,while循环停止
```python unuser = [‘a’,’b’,’c’] user = []
验证每个用户,直到没有未验证的用户为止
将每个验证的列表都移动到已验证的用户列表中
while unuser:
#使用pop函数,把为验证列表的最后一个元素弹出,放在变量current_user中current_user = unconfirmed_user.pop()print('正在验证用户:' + current_user)#使用append函数把刚才验证过的用户添加到已验证列表中user.append(current_user)
print(‘现在已经验证的用户都有:’) for cuser in user: print(cuser.title())
<a name="52676027"></a>#### 1.使用while循环删除列表中的指定元素```python#while 要删除的元素 in 列表:# 列表名.remove(要删除的元素)foods = ['甜甜圈','鸡肉卷','鸡肉卷','蛋挞','披萨']while '鸡肉卷' in foods:foods.remove('鸡肉卷')print(foods)
原理:只要要删除的元素还在列表里面,while循环就会不断执行,直到列表中没有我们要删除的元素。
过程:先做判断看鸡肉卷是不是在foods里,然后执行remove函数。
执行完后再判断鸡肉卷是不是在foods里,如果在,执行remove函数,如果不在,退出循环,指定元素已经删除结束。
2.使用用户输入来填充字典
- 还是要使用标志来切换状态,再加上字典就可以啦
7-8
sandwich_orders = ['烧饼','梅干菜扣肉饼','囊饼']finished_sandwiches = []while sandwich_orders:eat = sandwich_orders.pop()print('我现在正在吃:'+ eat)finished_sandwiches.append(eat)for i in finished_sandwiches:print(i + '我已经吃完了!')
第八章、函数
一、定义函数
#定义函数def 函数名():函数体#使用函数函数名()
函数名命名的注意点:
遵从变量命名的要点
- 不能数字开头
- 小驼峰命名发
1.实参和形参
```python def dong(name): print(‘我的名字是’ + name)
dong(‘hehe’)
> **`形参:`**在上面的定义函数的代码中, 括号里的那个参数没有真实的含义,只是让大家知道,这里应该放一个参数。> **`实参:`**在上面使用函数的代码中,括号里面传入的字符串就是实参,这个参数被存放在形参name中。<a name="cbf69155"></a>#### 2.位置实参> 故名思意,传入实参的位置要与我们定义的形参的位置所对应,这个也是我们最常见的传参方式,再此不多做解释。<a name="7b5eca76"></a>#### 3.关键字实参> **不考虑闯入参数时实参的顺序**:我们在传入的时候,就对指定的形参指定具体的值,这样就不用顾及传入参数的顺序啦。> ```pythondef dong(name, age, city):print('来自' + city '的' + name + '今年已经' + age '岁了')#位置实参的方式传入参数,需要注意参数的位置dong('张三', 13, '北京')#关键字实参传入参数,不需要注意参数的位置,就算传入时位置与形参不同,也不影响输出结果dong(age=13, city='上海', name='李四')
4.默认值
作用:我们在定义函数的时候可以给一些参数设置默认值,在后面调用函数的时候,我们如果没有给设定了默认值的参数赋值,那么这个参数的值就是默认值。
- 默认值参数在定义时一般放在末尾,因为,我们一般使用的时位置实参
- 设置了默认值的参数在调用时可以不给这个参数赋值
- 没有设置默认值的参数,在调用时必须给相关的参数赋值,不然会报错
二、返回值
三、传递列表
1.在函数中修改列表
将列表传递给函数后,函数就可以对列表进行修改。
而且在函数中对这个列表所做的所有的操作都是永久的。
注意:如果列表是全局变量,若它不以参数的形式传入函数,他是不能在函数里面修改的。
若它以参数的形式传入函数,它是可以被修改的。
2.禁止函数修改列表
方法:将列表得副本传递给函数
function_name(list_name[:])#使用函数名[:]切片的方式,就可以获得列表得副本
8——10
def show_magicians(name, greatname):while name:current_name = name.pop()a ='the ' + 'Great' + current_nameprint(a)greatname.append(a)name_list = ['张三','李四','王五','赵六']greatname = []show_magicians(name_list[:],greatname)print(name_list)print(greatname)
四、传递任意数量的实参
问题:预先不知道要传入几个参数怎么办?
解决:使用*name,创建了一个名字叫做name的元组,所有收到的实参都会放在这个元组里面。(无论传入多少个参数都可以)
def 函数名(*name):
1.混合使用参数
要点:把任意参数放在定义的形式参数的最后面,就像下面这样
def 函数名(can1, can2, can3, *name):
2.使用任意数量的关键字实参数
问题:在上面我们可以向函数中传入任意数量的参数,但是我们不知道,我们传入的这些参数具体代表是么意思,有什么用途,这怎么办?
解决:
- 传入参数时,要求用户传入键值对,以用来对传入的参数进行解释。
- **name:代表往函数中传入任意数量的键值对。
```python def build_profile(first, last, **user_info):
#形参**user_info要求后面必须传入键值对profile = {}profile['first_name'] = firstprofile['last_name'] = lastfor key, value in user_info.items():profile[key] = valuereturn profile
user_profile = build_profile(‘albert’, ‘einstein’, location = ‘princenton’, field = ‘physics’) print(user_prfile000)
<a name="0840ca53"></a>### 五、将函数存储在模块中<a name="d84244f6"></a>#### 1.导入模块的三种方式- import 模块名- from 模块名 import *- 导入该模块中的所有函数- from 模块名 import 函数名- 导入该模块中的某个函数<a name="41942cc8"></a>#### 2.使用as给模块和函数重命名-from 模块名 import 函数名 as 新的函数名-import 模块名 as 新的模块名<a name="f45611c3"></a>## `第九章、类`<a name="830fc9d6"></a>### 一、创建和实用类```python#创建狗类class Dog():def _init_(self, name, age):#初始化属性name和ageself.name = nameself.age = agedef sit(self):#模拟小狗被命令蹲下print(self.name.title()+' is now sitting')def roll_over(self):#模拟小狗被命令时打滚print(self.name.title()+ " rolled over!")
1.方法__init__()
方法:类中的函数称为方法。
__init__()当我们根据类创建新实例时,Python都会自动执行这个函数。
self
- 是一个指向实例本身的引用,让实例能够访问类中的属性和方法
- 以self为前缀的变量都可供类中的所有方法使用,我们还可以通过类的任何实例来访问这些变量
属性
在类中可以通过self直接访问的变量
self.name = name
二、创建实例
my_dog = Dog('willie', 6)print('我的狗的名字是' + my_dog.name.title() + '.')my_dog.sit()
2.1 访问属性 & 调用方法
采用句点 ==.==表示法
my_dog.name'''my_dog是实例name是实例中的属性'''my_dog.sit()#sit()是方法
类创建好以后就可以创建多个实例了
2.2 给属性指定默认值
class Car():'''模拟汽车'''def __init__(self, make, model, year):'''初始化汽车的属性'''self.make = makeself.model = modelself.year = year#在这个给历程属性默认值self.odometer_reading = 0def get_descriptive_name(self):long_name = str(self.year) + ' ' + self.make + '' + self.modelreturn long_name.title()def red_odometer(self):'''打印一条指出汽车历程的信息'''print('这辆汽车一共走了' + self.odometer + '公里了!')#在定义类时,直接给属性赋值就行
2.3 三种修改属性值的方式
2.3.1 直接修改属性的值
new_car('audi', 'a4', 2016)#直接通过实例访问属性,然后修改属性的值就行new_car.odometer_reading = 23
2.3.2 通过方法修改属性的值
定义一个方法,通过这个方法修改属性的值
class Car():--snip--def update_odometer(self, mileage):if mileage >= self.odometer_reading:#这个函数用来给历程数指定特定的值self.odometer_reading = mileageelse:print('You can not roll back an odometer!')
2.3.3 通过方法对属性的值进行递增
class Car():--snip--def update_odometer(self, mileage):--snip--def increment_odometer(self, miles):#将里程表读数增加指定的量sefl.odometer_reading += miles
三、继承
什么时候继承?
- 编写的类是另一个现成类的特殊版本,可使用继承。
继承的特点:
- 一个类继承另一个类时,它将自动获得另一个类的所有属性和方法
- 子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法
- 原来的类称为父类,新的类称为子类
class ElectricCar(Car):'''电动车特有的地方'''def __init__(self, make, model, year):'''初始化父类的属性'''super().__init__(make, model, year)
注意:
- 创建子类时,父类必须包含在同一个文件中,且得在子类的前面
- 定义子类是,必须在括号里指定父类的名称
- 方法init()接受创建Car实例所需要的信息
- super()这个函数,让子类实例包含父亲的所有属性
- 父类也称之为超类,因此也名为super
3.1 给子类定义属性和方法
定义子类特有的方法
class Car():--snip--class ElectricCar(Car):def __init__(self, make, model, year):shuxb'''电动汽车的独特之处初始化父类属性,再初始化电动车特有属性'''super().__init__(make, model, year)#在这里定义了一个新的属性self.battery_size = 70def describe_battery(self):#打印一条描述电瓶容量的消息print('这辆车的电瓶容量是'+str(self.battery_size))
3.2 重写父类的方法
为什么要重写父类方法?
- 如果父类的方法不符合子类模拟的事物的行为,则对其进行重写
如何重写?
- 在子类中定义一个与父类同名的方法,在运行时Python就会优先考虑子类中重写的方法
重写的意义?
- 能让子类对父类进行取其精华,弃其糟粕
3.3 将大类拆分成小类
- 比如前面电动车中,电瓶有关的方法和属性很多,就可以把电瓶相关的内容摘出去,单独作为一个类
#这是最开始的父类class Car():--snip--class Battery():'''一次模拟电瓶车的简单尝试'''def __init__(self, battery_size = 70):self.battery_size = battery_sizedef describe_battery(self):#打印一条描述电瓶容量的消息pring('这辆车的电瓶容量是'+str(self.battery_size))classs Ecar():'''这是一个电动车的类'''def __init__(self, make, model, year):'''初始化父类属性,再初始化电动车特有的属性'''super().__init__(make, model, year)self.battery = Battery()
四、导入类
#方法1import 模块名'''这种方法在后面使用模块中方法和属性的时候要在前面加上类名比如下面这种格式:'''Dog.my_dog.sit()#方法2from 模块名 import 类名'''这种方法导入模块中指定的类在后面编写代码的时候,不需要写类名'''#方法3from 模块名 import 类名'''导入模块中的所有类在后面编写代码时,不需要写类名'''
第十章 文件和异常
一、从文件中读取数据
1.1 读取整个文件
open(文件的名称)函数
- 作用:打开文件,所有对文件进行操作的第一步
- 参数文件的名称要以字符串的形式传入
with关键字
- 无论 with 中的代码块在执行的过程中发生任何情况(就算有bug),文件最终都会被自动关闭。
read()方法
- 读取这个文件的全部内容,将其作为一个常字符串返回
read()到达文件末尾时返回一个空字符串,这个空字符串显示出来就是一个空行
- 对contents变量使用.rstrip()函数删除最后的空行
with open('pi_digits.txt') as file_object:contents = file_object.read()#rstrip()函数删除空行print(contents.rstrip())
1.2 文件路径
相对路径
- 文件相对于正在编写的.py文件的位置
绝对路径
- 文件在电脑中的具体位置
- ‘C:\User\adogn\other_files\text_files\filename.txt’
- 注意在windows系统中用的是反斜杠
1.3 创建一个包含文件各行内容的列表
- 如果不将内容保存在列表或变量中,文件的内容只可在with结构内可用
- 保存在列表以后,在with结构后面也可以对文件内容进行操作
readlines()函数
- 从文件中读取每一行,并将每一行作为一个元素存储在列表中,文件整体都存在一个列表中
filename = 'pi_digits.txt'with open(filename) as file_object:lines = file_object.readlines()for line in lines:print(line.rstrip())
1.4 使用文件中的内容
filename = 'pi_digits.txt'with open(filename) as file_object:lines = file_object.readlines()pi_string = ''for line in lines:pi_string += line.restrip()print(pi_string)print(len(pi_string))
