选择你自己的 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 方法
help(D.get)
- 试试
- 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')。预测将会发生什么,并解释原因。
- dict(a=1)
- dict('a'=1)
- dict(class=1)
- 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 构造函数只要条件为真就运行循环的主体。
这是一个示例
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)
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