有人可以帮助我理解 Zed Shaw 的 ex23 学习 Python 3 的艰难方式



我正在试图破译Zed的ex23,他的解释有点帮助,但我迷路了。这个剧本讲述了他试图教你如何解码和编码不同语言的字母。其中一些话题似乎为时过早/他还没有讨论过,他提到这比我见过的任何事情都要困难,但我一直在迷失方向。我会根据我所看到的来解释我能解释什么,但我不确定我是否理解这里的一切。

import sys script, input_encoding, error = sys.argv

这很简单,我们只是导入sys并定义argv的变量。

def main(language_file, encoding, errors):
line = language_file.readline() 

用三个变量定义标题为main的函数。定义行以读取语言文件中的行。language_file是如何定义的?我哪里都看不到定义?

if line:
print_line(line, encoding, errors)  
return main(language_file, encoding, errors)

如果行中有定义的内容,它将运行以下内容。如果它没有(也就是说,如果它是假的(,那么它就不会。在不定义上面的函数的情况下,如何创建if语句?我有什么东西不见了吗。Zed在下面定义了print_line,但在上面使用它?回水干什么?这是否意味着我们回到了基本函数?

def print_line(line, encoding, errors):
next_lang = line.strip()  
raw_bytes = next_lang.encode(encoding,
errors=errors)

我们在这里定义print_line。条形图功能是什么?错误是什么意思?

cooked_string = raw_bytes.decode(encoding, errors=errors) 

我们将cooked_string定义为获取原始字节并对其进行编码…我想?

print(raw_bytes, "<==>", cooked_string)

languages = open("languages.txt", encoding = "utf - 8")

为什么是语言与语言文件?

main(languages, input_encoding, error)

我认为这本书中的练习有点为时过早,或者我只是没有看到什么。如有任何帮助,我们将不胜感激。

以下是完整的不间断的草稿,没有我的评论:

def main(language_file, encoding, errors):
line = language_file.readline() #defining line as a read off of language_file

if line: # if line has something from what it is defined to be it will run the below. If it does not (AKA if it's false), then it won't.
print_line(line, encoding, errors)  
return main(language_file, encoding, errors)
def print_line(line, encoding, errors):
next_lang = line.strip()  # what is strip?
raw_bytes = next_lang.encode(encoding, errors=errors) 
cooked_string = raw_bytes.decode(encoding, errors=errors) 
print(raw_bytes, "<==>", cooked_string)

languages = open("languages.txt", encoding = "utf - 8")
main(languages, input_encoding, error)

我会按顺序回答您的问题:

  1. 如何定义language_file?CCD_ 1被定义为主函数的参数。当在下面调用main时,它被传入。它是在languages = open("languages.txt", encoding = "utf - 8")行中打开的文件
  2. 在不定义上面的函数的情况下,如何创建if语句?这很棘手。。。Python是一种解释语言,意味着它在运行时读取代码、运行代码并将Python代码穿插到机器代码中。因为printline函数是在对main函数的调用之上定义的,所以它可以正常工作。考虑一下函数的定义位置与运行位置
  3. return main(language_file, encoding, errors)行递归地调用主函数。这意味着它将读取文件的下一行,直到没有更多的行,然后它将停止执行
  4. strip函数删除字符串开头和结尾的空白
  5. 函数定义中的errors=errors设置了一个默认参数。这意味着当你只传递一个参数而不是两个参数时,设置errors=errors。上面在import语句中定义了错误。在这里查看关于处理python函数参数的不同方法的极客对极客教程
  6. 这两行:
raw_bytes = next_lang.encode(encoding, errors=errors) 
cooked_string = raw_bytes.decode(encoding, errors=errors) 

第一行使用指定的编码创建字符串next_lang的字节表示的字符串。第二行将其解码为python字符串。请参阅此处以获取字符串的utf-8编码表。utf-8只是一个编码选项。有许多不同的方法可以将字符串编码为字节。

  1. 为什么是语言与语言文件?languages是打开文件句柄后存储该句柄的变量。然后语言作为参数传递给主函数。主函数的第一个参数被命名为";language_file";,因此,它本质上是在主函数期间将语言重命名为language_file

最新更新