跳转到内容

选择你自己的 Python 冒险/中期回顾

来自维基教科书,开放世界中的开放书籍

好吧,它不是全部回顾。其中一部分是新的。其余部分是回顾。

这些例子和问题应该很有挑战性!参与进来,动手实践!学习编程的唯一方法就是尝试编写代码。当代码出现错误时

  • 深呼吸
  • 阅读错误信息。它们通常很有信息量。
  • 检查你的
    • 缩进
    • 匹配的括号/大括号/方括号/引号
    • 自尊心。我们都会犯错!


如果你对这里有任何困惑,请查找更完整的 Python 参考,或在课堂上提出问题。


  • 字典将键与值关联
  • 通过它们的键进行访问
  • 没有固有的顺序
  • 练习:创建字典 D,我们将在整个练习中使用它。注意:我们也可以使用 dict() 函数来创建一个字典。
D = {'i':1, 'l': [1,2,3], 's': "my favorite string", d= dict(a=1,b=2)}

这里哪里错了?现在试试这个。

D = {'i':1, 'l': [1,2,3], 's': "my favorite string", 'd': dict(a=1,b=2)}
  • D 的键是什么?
答案

获取所有键

   d.keys()  # this won't work since d isn't defined!
   D.keys()
  • 值是什么?
答案

获取值

   D.values()


  • 尝试访问 D 的值
答案

访问

   D['i']
   D['d']
   D['c']  # what happens when it doesn't exist?
  • 尝试从 D 中删除键值对
答案

使用 del 删除

   del D['i']
   del D['c']
  • 尝试向 D 添加键值对:'newkey' -> True
答案

添加

   D['newkey'] = True
  • 检查字典的get 方法
    1. help(D.get)
    2. 试试
      • D.get('i',"notfound")
      • D.get('c',"notfound")
答案

关于内置函数 get 的帮助

   get(...)
       D.get(k[,d]) -> D[k] if k in D, else d.  d defaults to None.
       

基本上,如果 k 在 D 中,返回 D[k],否则返回 d。这可以避免我们在字典中没有键时出现 KeyError 错误。

  • 额外练习: 尝试 dict(1='a')。预测将会发生什么,并解释原因。
    1. dict(a=1)
    2. dict('a'=1)
    3. dict(class=1)
    4. help(dict)
答案

1 不是有效的 Python 变量名。dict() 函数期望有效的 Python 标识符,如帮助中所述。


  • 额外练习: D 的第一个元素是什么?


答案

这是一个陷阱问题!字典没有固有的顺序!它可能在不同的机器或不同的 Python 版本之间有所不同。无论如何,它不是应该依赖的东西。

列表、元组、字符串

[编辑 | 编辑源代码]

列表、元组和字符串都是 Python 序列类型

  • 它们是有序的
  • 它们通过它们的索引 [0,..,n] 进行访问,与字典不同,字典通过键进行访问
  • 一些是可变的(意味着元素可以改变)
  • 字符串具有额外的诸如 upper、lower、split 等方法
  • 序列支持切片(见下文)
  • 构造 L,t,s 如下
   L = [8,'a',[1,2,3],None,'b']
   t = ('hallway', "a creepy hallway!")
   s = "a few of my favoirite strings"


  • 尝试访问不同的元素。
   L[0]
   s[1]
   t[2]
   L['a'] 
答案

L['a'] 失败,因为序列通过索引访问,而不是通过名称访问。

  • 哪些是不可变的?
   L[0] = 1
   s[0] = 1
   t[0] = 1
   
答案

元组和字符串是不可变的。元组意味着位置有意义,而列表可以追加、删除等。


  • 额外练习 切片实验
   L[:2]
   L[2:]
   L[-3]
   L[10]
   L[::-1]


  • 编写这个函数
   yell_month(name,monthint) -> string

它的工作原理是这样的

   >>> yell_month('gregg', 1)
   'January GREGG'
   >>> yell_month('mIRANda', 7)
   'July MIRANDA'
  • 尝试使用字典和 if/elif/else 语句
答案

两种方法

   # here's one method, using a dict. 
   def yell_month(name,monthint):
       months = {1: 'January', 2: 'February', }  # etc.
       name = name.strip().upper()
       return months.get(monthint, "MONTHUARY") + " " + name
   # another, using if/else
   def yell_month(name,monthint):
       month = "SMARCH"
       if monthint == 1:
           month = "January"
       elif monthint == 2:
           month = "February"
       ... # lots of omitted code
       else:
           month = "SMARCH"
       name = name.strip().upper()
       return month + " " + name
   
   # which do you think is easier?


有时我们想做一些事情不止一次。计算机不会厌烦重复工作,而且有无限的耐心。利用这一点!


迭代器

[编辑 | 编辑源代码]

Python 有一种神奇的构造,称为 for...in,它可以迭代数据结构。

   for element in thing:
       print element, type(element)

尝试迭代我们的序列,将我们的朋友 D,s,t,L 代替 'thing'。

答案

迭代器示例

   for thing in (D,s,t,L): 
       print thing
       for element in thing:
           print element, type(element)


While 循环

[编辑 | 编辑源代码]

while 构造函数只要条件为真就运行循环的主体。

这是一个示例

def countdown(n):
    while n >= 1:
        print n
        n = n -1
    print "liftoff"


  • 尝试使用不同的 n 值,例如 0、1、-1、'a'、None
  • 编写一个函数,它可以计数到一个数字。
  • final_countdown,尽管它的名字,但使用的是 for 循环
def final_countdown():
    ''' print a version  of Europe's 'The Final Countdown' '''
    phrases = [ 
            'do de do dooo',
            'do de do do dooo',
            'de do de do',
            'de do de do do de dooo'
            'do de doo', 
            'do de do',
            'do de do do deee dooooo',
            'WEEEEE WOOOOOOOO',
    ]
    for phrase in phrases:
        print phrase

额外练习: 制作倒计时等待

[编辑 | 编辑源代码]

如果我们实际上希望该函数在循环之间等待一秒钟怎么办?Python 中有一个名为 [time.sleep] 的函数,我们可以使用它。

展示 time.sleep 的示例
import time
def countdown(n, wait=1):
    while n >= 1:
        print n
        time.sleep(wait)
        n = n -1
    print "liftoff"

countdown(5,.5)

额外练习: breakcontinue

[编辑 | 编辑源代码]
  • break 会退出循环
  • continue 会继续执行循环中的重复部分
示例

包含 continue 和 break 的示例

   def cases_spaces_breaks(sentence):
       for letter in sentence:
           if letter == " ":
               break
           elif letter.islower():
               continue
           elif letter.isupper():
               print  letter, "is uppity!"
           else:
               print letter, "is middle cased?"
  • 尝试使用各种输入句子来运行它,以了解它的功能


标准库

[编辑 | 编辑源代码]

探索 标准库.

  • 选择一个函数或模块,并进行实验。
  • 告诉大家你选择了哪个!
  • 展示使用它的代码。
  • 描述它的输入和输出。


动手实践!

[编辑 | 编辑源代码]

查看 标准异常(错误),看看你认出了哪些。尝试编写触发这些错误的代码

  • SyntaxError
  • KeyError
  • NameError
  • TypeError(提示:int() 是一个很好的选择!)
  • IndexError
  • ImportError
答案

生成一些错误

   a = '1 # SyntaxError
   {}['a'] # KeyError
   print fake_var # NameError
   int('a')  # TypeError
   [1,2,3][8]  # IndexError
   import fake # ImportError
华夏公益教科书