寒假Python之旅part 2
?
? 我觉着五章一篇文章应该挺合理,总共二十章,完美)
话不多说开始⑧
2.9~2.13
? 痛改前非的第四天,让我们来康康今天学啥
第 6 章 字典
? 编程语言里出现这两个字还真挺奇怪,不过我的第一反应是:我超!法典!
-
在Python中,字典是一系列键——值对 。每个键 都与一个值相关联,你可以使用键来访问与之相关联的值。与键相关联的值可以是数字、字符串、列表乃至字典。事实上,可将 任何Python对象用作字典中的值。 -
在Python中,字典用放在花括号{} 中的一系列键—值对表示,就像这样 alien_0 = {'color': 'green', 'points': 5}
冒号前是键,后是值,键——值对用冒号隔开,键——值对之间用逗号隔开 -
想要访问字典中的值,可依次指定字典名和放在方括号内的键,用中括号 print(alien_0['color'])
green
-
字典是一种动态结构,可随时在其中添加键—值对。(这话说的,列表不也这样吗( alien_0['x_position'] = 0
alien_0['y_position'] = 25
像这样输一个原来没有的键再赋上值即可 值得一提的是,我手里的教材告诉我添加是不按顺序来的,然鹅我手里的python3.10告诉我其实字典是按顺序添加的( -
看得出来字典和列表是有相似之处的,比如空字典就是赋{},修改字典还是赋值,删键——值对也是,不过改和删都得指定好键 -
如果你为了美观想在字典里整回车,注意一下格式 favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phil': 'python',
}
print后面也可以有 print("Sarah's favorite language is " +
favorite_languages['sarah'].title() +
".")
-
遍历字典同样使用for循环,但是有多种情况
-
遍历所有的键——值对:使用方法item() for key, value in user_0.items():
print("Key: " + key)
print("Value: " + value)
Key: last
Value: fermi
当然,你也不一定键值两个都要打出来… -
遍历字典中的所有键:使用方法keys(),但其实遍历字典时,会默认遍历所有的键,所以这个".keys()"可有可无。 for name in favorite_languages.keys():
不过keys()不止遍历,它会返回一个包含所有键的列表,因此可以对其进行只有再列表里才能做的判断 if 'erin' not in favorite_languages.keys():
如果想要按某种顺序遍历键,可以用sorted()函数对返回的列表处理 for name in sorted(favorite_languages.keys()):
-
遍历字典中的所有值:使用方法values(),它会返回一个值列表 如果想要剔除重复项可使用函数set(),它把列表变成没有重复项,和列表类似的集合) -
套娃嵌套:在列表中嵌套字典、在字典中嵌套列表甚至在字典中嵌套字典。 看完了,难以言表,连夜去蚌埠安家罢
第 7 章 用户输入和 while 循环
? 您瞧瞧,这不是老熟人吗)
-
函数input():函数input() 让程序暂停运行,等待用户输入一些文本。
获取用户输入后,Python将其存储在一个变量中,以方便你使用。其中括号内的是参数,即输入的提示 -
运算符**+=** 在存储在prompt 中的字符串末尾附加一个字符串 prompt = "If you tell us who you are, we can personalize the messages you see."
prompt += "\nWhat is your first name? "
print(prompt)
If you tell us who you are, we can personalize the messages you see.
What is your first name?
-
使用函数int()来获取数值输入 -
在python2.7中… -
while循环: while XXXXXX:
XXXX
再次说明一下,a += 1 是a = a + 1 的缩写 -
标志:定义一个变量,用于判断整个程序是否处于活动状态。如果True就好说,要是False就不干了,多说无益,上🐎 active = True
while active:
message = input(prompt)
if message == 'quit':
active = False
else:
print(message)
-
break:简简单单5个字母,轻松退出循环 -
continue:断掉后面的直接从判断条件那开始 -
但在for 循环中不应修改列表,否则将导致Python难以跟踪其中的元素。(我不懂,听他的就对了)
简简单单做个作业
sandwich_orders=['superhot','pastrami','pastrami','veryhot','pastrami','hhh']
finished_sandwiches=[]
print('五香味没了')
while 'pastrami'in sandwich_orders:
sandwich_orders.remove('pastrami')
while sandwich_orders:
print("finished")
finished_sandwiches.append(sandwich_orders.pop())
print(*finished_sandwiches)
没了
finished
finished
finished
hhh veryhot superhot
还挺少
第 8 章 函数
鸡冻任鑫的函数环节,可以diy函数力!
-
定义函数:上🐎 def greet_user():
"""显示简单的问候语"""
print("Hello!")
-
像函数传递信息:在上述greet_user(XXX) 括号内添加一个变量名,执行函数时提供一个变量值给这个变量XXX即可,像这样greet_user('jesse') -
形参和实参:上段中,XXX这个变量名是形参,而’jesse’是实参 -
传递实参:函数调用时会有不同参数
-
位置实参:def describe_pet(animal_type, pet_name): ,基于顺序的参数 -
关键字实参:在调用函数时直接赋值describe_pet(animal_type='hamster', pet_name='harry') ,这样就不用管什么顺序了(但是感觉好麻烦) -
给形参设定默认值:在定义函数时动手脚,像这样:def describe_pet(pet_name, animal_type='dog'): ,此时如果只给一个参数则会被解读为位置实参 -
返回值:顾名思义,可使用return 语句将值*[HTML]:可以是任何类型。返回到调用函数的代码行 -
Python将非空字符串解读为True,和列表和字典同理 -
传递任意数量的形参:形参名*toppings 中的星号让Python创建一个名为toppings 的空元组,并将收到的所有值都封装到这个元组中。(toppings没别的意思) ? 那么怎么输入任意数量的关键字实参呢?形参**user_info 中的两个星号让Python创建一个名为user_info 的 空字典,并将收到的所有键—值对都封装到这个字典中。不过键值对的输入方式和我们想的不一样:location='princeton' 键没有单引号,中间用的也是等号而不是冒号(我完全无法理解,照做就是了) -
模块:函数的优点之一是,使用它们可将代码块与主程序分离。通过给函数指定描述性名称,可让主程序容易理解得多。你还可以更进一步,将函数存储在被称为模块的独立文件中, 再将模块导入到主程序中。import 语句允许在当前运行的程序文件中使用模块中的代码。 在调用函数之前import 模块名 ,调用时会有模块名.函数() (也就是说模块就是一个.py后缀的函数库?) ? Python读取这个文件时,代码行import pizza 让Python打开文pizza.py,并将其中的所有函数都复制到这个程序中。你看不到复制的代码,因为这个程序运行时,Python在幕后复制这些代码。你只需知道,在making_pizzas.py中,可以使用pizza.py中定义的所有函数。那你tm要那一个小点点干嘛 ? 如果想要导入特定的函数,from 模块名 import 函数名, function_0, function_1, function_2 。若使用这种语法,调用函数时就无需使用句点。由于我们在import 语句中显式地导入了函数make_pizza() ,因此调用它时只需指定其名称。 ? 使用星号(* )运算符可让Python导入模块中的所有函数:from pizza import * 注:import 语句中的星号让Python将模块pizza 中的每个函数都复制到这个程序文件中。由于导入了每个函数,可通过名称来调用每个函数,而无需使用句点表示法。然而,使用并非自己编写的大型模块时,最好不要采用这种导入方法:如果模块中有函数的名称与你的项目中使用的名称相同,可能导致意想不到的结果:Python可能遇到多个名称相同的函 数或变量,进而覆盖函数,而不是分别导入所有的函数。 最佳的做法是,要么只导入你需要使用的函数,要么导入整个模块并使用句点表示法。这能让代码更清晰,更容易阅读和理解。这里之所以介绍这种导入方法,只是想让你在阅读别人编写的代码时,如果遇到类似于下面的import 语句,能够理解它们。 -
使用as给函数指定别名:例:在import 语句中使用from 模块名 import make_pizza as mp ,关键字as 将函数重命名为你提供的别名。 -
还可以给模块指定别名:import pizza as p -
作者的建议: ? 如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开 ? 所有的import 语句都应放在文件开头,唯一例外的情形是,在文件开头使用了注释来描述整个程序。 ? 应给函数指定描述性名称,且只在其中使用小写字母和下划线。描述性名称可帮助你和别人明白代码想要做什么。给模块命名时也应遵循上述约定。 ? 每个函数都应包含简要地阐述其功能的注释,该注释应紧跟在函数定义后面,并采用文档字符串格式。 ? 给形参指定默认值时,等号两边不要有空格: ?
第 9 章 类
? 又是看上去非常高级的东西~似乎是模拟用的
class Dog():
"""一次模拟小狗的简单尝试"""
def __init__(self, name, age):
"""初始化属性name和age"""
self.name = name
self.age = age
def sit(self):
"""模拟小狗被命令时蹲下"""
print(self.name.title() + " is now sitting.")
def roll_over(self):
"""模拟小狗被命令时打滚"""
print(self.name.title() + " rolled over!")
看不懂吗?我也看不懂!
-
方法__init__() :类中的函数称为方法;你前面学到的有关函数的一切都适用于方法。方法__init__() 是一个特殊的方法,每当你根据Dog 类创建新实例时,Python都会自动运行它。而两个下划线是为了防止与普通方法产生冲突。 ? 此方法包括三个形参,其中形参self 必不可少,还必须位于其他形参的前面。创建Dog实例时会自动传入实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。我们创建Dog 实例时,Python将调用Dog 类的方法__init__() 。我们将通过实参向Dog() 传递名字和年龄;self 会自动传递,因此我们不需要传递它。每当我们根据Dog 类创建实例时,都只需给最后两个形参(name 和age )提供值。<原谅看不懂的我只能复制粘贴> -
以self 为前缀的变量都可供类中的所有方法使用~~(即公交车)~~,我们还可以通过类的任何实例来访问这些变量。self.name = name 获取存储在形参name 中的值,并将其存储到变量name 中,然后该变量被关联到当前创建的实例。self.age = age 的作用与此类似。像这样可通过实例访问的变量称为属性。 -
根据类创建实例: class Dog():
--snip--
my_dog = Dog('willie', 6)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
-
给属性(不是形参)指定默认值:很简单,在初始化时加入self.属性名 = 初始值 。(不过从形参那直接动手效果应该一样) -
修改属性的值:
- 通过实例直接改:
实例名.属性 = XX - 通过方法改:把上面那个修改式搬到一个新的方法里
- 通过方法对属性里的值递增:简单的 += 。加的值是方法的参数。
-
如果你要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法。 ? 创建子类时,父类必须包含在当前文件中,且位于子类前面。定义子类时,必须在括号内指定父类的 名称。方法__init__() 接受创建Car 实例所需的信息。继承是这样的: class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self, make, model, year):
"""初始化父类的属性"""
super().__init__(make, model, year)
? super() 是一个特殊函数,帮助Python将父类和子类关联起来。这行代码让Python调用ElectricCar 的父类的方法__init__() ,让ElectricCar 实例包含父类的所 有属性。父类也称为超类(superclass),名称super因此而得名。 -
给子类添加属性:直接加个属性添上初始值:self.battery_size = 70 -
重写父类的方法:def fill_gas_tank(): 像这样直接删掉self -
可以将大型类拆分成多个协同工作的小类:self.属性名 = 类名() 加上类1名.属性.类的方法名() -
导入类:可以将类存至模块里。导入方法和函数一致,不多赘述 你甚至可以在一个模块导入另一个模块,玩上多米诺骨牌 -
学会借助外力,白嫖使用别人的库
|