寒假Python之旅part2

寒假Python之旅part 2

​ 我觉着五章一篇文章应该挺合理,总共二十章,完美)

话不多说开始⑧

2.9~2.15

​ 痛改前非的第四天,让我们来康康今天学啥

第 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',  #缩进4格
    	'sarah': 'c', 
    	'edward': 'ruby', 
    	'phil': 'python', #最后的逗号可有可无
    	}
    

    print后面也可以有

    print("Sarah's favorite language is " + 	#加号后回车  
    	favorite_languages['sarah'].title() +   #缩进4格
    	".")
    
  • 遍历字典同样使用for循环,但是有多种情况

    • 遍历所有的键——值对:使用方法item()

      for key, value in user_0.items():  
      	print("Key: " + key)			#key和value都是变量
          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 += 1a = 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 章 类

​ 又是看上去非常高级的东西~似乎是模拟用的

  • 创建和使用类:比如创建Dog类,模拟所有狗。类名应采用驼峰命名法 ,即将类名中的每个单词的首字母都大写,而不使用下划线。实例名和模块名都采用小写格式,并在单词之间加上下划线。

class Dog(): 					#从空白创建一个类
	"""一次模拟小狗的简单尝试"""

	def __init__(self, name, age):	#定义方法/函数
		"""初始化属性name和age"""
		self.name = name#获取存在形参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) 	#创建实例并传递参数name和age
    
    print("My dog's name is " + my_dog.name.title() + ".")
    print("My dog is " + str(my_dog.age) + " years old.")
    
    • 访问属性:my_dog.name。句点表示法在Python中很常用,这种语法演示了Python如何获悉属性的值。在Dog 类中引用这个属性时,使用的是self.nameself.name是“名字”而不是特定的名字。

    • 调用方法:使用句点表示法来调用Dog 类中定义的任何方法。

  • 给属性(不是形参)指定默认值:很简单,在初始化时加入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名.属性.类的方法名()

  • 导入类:可以将类存至模块里。导入方法和函数一致,不多赘述

    你甚至可以在一个模块导入另一个模块,玩上多米诺骨牌

  • 学会借助外力,白嫖使用别人的库

第 10 章 文件和异常

​ 今晚有些迟了,不过问题不大,应该能写完?(明天的我:我宣布写不完了)(后台的我:我超怎么还没写完)

  • 读取文件:

    with open('pi_digits.txt') as file_object: #函数open(),参数是文件名(同一目录下)
    	contents = file_object.read()
    	print(contents)
    

    典中典之完全不明白。

    ​ 函数open() 打开文件,返回一个表示文件的对象。在这里,open('pi_digits.txt')返回一个表示文件pi_digits.txt 的对象,并将对象存储在后面的变量里。关键字with在不再需要访问文件后将其关闭。(也就是说没有with的话你得有个close(),但是水很深,人把握不住,所以就用with交给机器了)有了表示文件的对象后,使用方法read()读取文件的全部内容,并将其作为一个长长的字符串存储在变量contents 中。

    ​ 注:read() 到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。要删除多出来的空行,可在print 语句中使用rstrip()。

    ​ 也可以读取文件的路径,如果目标文件在同一个大文件夹的小文件夹里,可以使用相对路径'text_files\filename.txt'(注意反斜杠和单引号啊)。不行就是绝对路径了:'C:\Users\ehmatthes\other_files\text_files\filename.txt'然而我试了之后发现不能用反斜杠,似乎会被当成转义字符之类的,对此有几个解决方法:

    • 在路径前面加一个r字母:可以把后面的字符串变成原始字符串,废了转义字符。
    • 将计就计,用两个反斜杠\\,这是表示一个反斜杠的转义字符

    ~~那我用正斜杠就是了!!!~~我只能说我不清楚(,可能有时候Windows系统不认正斜杠罢

  • 逐行读取:可使用for循环:

    filename = 'pi_digits.txt'
    
    with open(filename) as file_object:
    	for line in file_object:
    	print(line)
        
    3.1415926535 
    
    8979323846 
    
    2643383279 
    
    

    那么为什么多了一行呢,因为每行的末尾都有一个看不见的换行符,而print时本身有自带一个符。为了美观,对它使用方法rstrip()吧。

  • open() 返回的文件对象只在with代码块内可用。如果要在with代码块外访问文件的内容,可在with代码块内将文件的各行存储在一个列表中。这样:lines = file_object.readlines()于是我们又学到了方法readlines(),它从文件中读取每一行,并将其存储在一个列表中。

  • if XXX in XXX甚至可以检测字符串在字符串里面(

  • 可使用方法replace() 将字符串中的特定单词都替换为另一个单词。message.replace('dog', 'cat')

  • 写入文件:在调用open() 时需要提供另一个实参,告诉Python你要写入打开的文件。open(filename, 'w')其中读取模式’r’,写入模式’w’附加模式’a’既能读又能写’r+’,当然默认是只读。

    ​ 如果你要写入的文件不存在,函数open() 将自动创建它。然而,以写入(‘w’ )模式打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前(就是第一行那把对象付给变量那)清空该文件。就是说先删干净再写入

    注:Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str() 将其转换为字符串格式。

    ​ 函数write() 不会在你写入的文本末尾添加换行符,想要写入多行数据就使用换行符罢。

    ​ 要给文件添加内容,而不是覆盖原有的内容,可以附加模式打开文件。如果指定的文件不存在,Python将为你创建一个空文件。

  • 异常Error happen:可使用try-except代码块处理。

    try:
    	print(5/0)
    except ZeroDivisionError:  #此外除数是0的错误
    	print("You can't divide by zero!")
    

    ​ 就是说如果没错误就不管,有错误就看看expect中的代码块是不是这个错误,如果不是这个错误那就是错上加错(((

  • 想办法避免让用户看到traceback不知道的会疑惑,知道的会利用( 在实际运用中可以把可能会引起错误的的代码放入ry-except代码块从而避免定时炸弹。

  • FileNotFoundError 异常:不存在的文件。

  • 方法split()根据一个字符串创建一个单词列表。(方法是真的多啊)

  • 当对列表使用函数len()时,出来的是元素数目的数值。

  • 使用pass语句和expect,让python别管错误。

  • 存储数据:一种简单的方式是使用模块json(JavaScript Object Notation)并非python专属)来存储数据。(这个json还挺眼熟):

    ​ 函数json.dump() 来存储数据,接受两个实参:要存储的数据以及可用于存储数据的文件对象。

    import json    #导入模块
    
    numbers = [2, 3, 5, 7, 11, 13]
    
    filename = 'numbers.json'
    with open(filename, 'w') as f_obj:	#以写入模式打开文件
    	json.dump(numbers, f_obj)
    

    json.load() 将数据读取到内存中。基本没有区别,别忘了他会返回数据。

  • 重构:将代码划分为一系列完成具体工作的函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值