阅读《Python编程从入门到实践》Day06

第七章

1、函数input()的工作原理

函数input()让程序暂停运行,等待用户输入一些文本。

message = input("Tell me something, and I will repeat it back to you: ")
print(message)
# 输出:
Tell me something, and I will repeat it back to you: python
python

括号中接收的参数就是向用户显示的提示或者说明,让用户知道该如何做。

(1)编写清晰的程序

使用input()函数时,最好指定清晰的提示,便于用户输入准确的信息。通常在提示的末尾再添加一个空格,以便区分提示与输入。当你需要指出获取特定输入的原因时,提示可能会很长,这时就可以将提示存储在一个变量中,然后再将变量传递给函数input()。

prompt = "If you tell us who you are, we can personlize the messages you see."
prompt += "\nWhat is your first name? "
name = input(prompt)
print(name)
# 输出:
If you tell us who you are, we can personlize the messages you see.
What is your first name? Jackson
Jackson

上述例子演示了一种创建多行字符串的方式,首先将前半部分字符串存储在一个变量中,然后使用运算符+=在原本字符串的末尾附加一个字符串。

(2)使用int()来获取数值输入

使用函数input()时,Python将用户输入解读为字符串。

age = input("How old are you? ")
print(age)
print(type(age))
# 输出:
How old are you? 18
18
<class 'str'>

通过使用type()函数可以得知所输入的数值确实被当成了字符串类型。当你需要把它当成数字来使用时,就可以使用函数int(),它可以将数字字符串转换成数值。将数值输入用于计算和比较前,务必将其转换为数值表示。

(3)求模运算符

求模运算符(%)可以将两个数相除并返回余数。

print(10 % 3)
# 输出:
1
(4)在Python 2.7 中获取输入

如果你使用的是Python 2.7,应使用函数raw_input()来提示用户输入。这个函数与Python 3中的input()一样,也将输入解读为字符串。
Python 2.7也包含函数input(),但它将用户输入解读为Python代码,并尝试运行它们。因此,最好的结果是出现错误,指出Python不明白输入的代码;而最糟糕的结果是,将运行你原本无意运行的代码。所以如果你正在使用Python 2.7,请使用raw_input()来获取输入。

2、while循环简介

for循环用于针对集合中的每个元素的一个代码块,而while循环不断地运行,直到指定的条件不满足为止。

(1)使用while循环
current_number = 1
while current_number <= 5:
    print(current_number)
    current_number += 1
# 输出:
1
2
3
4
5

上述的循环例子中,表示当current_number的值小于等于5时,循环继续执行;当其大于5时,循环终止。

(2)让用户选择何时退出
prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "
message = ''
while message != 'quit':
    message = input(prompt)
    if message != 'quit':
        print(message)
# 输出:

Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Hello!
Hello!

Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Python
Python

Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. quit

在上述的程序中,只有当你输入“quit”的时候,程序才会退出,否则程序会一直循环下去。

(3)使用标志

在要求很多条件都满足才继续运行的程序中,可定义一个变量,用于判断整个程序是否处于活动状态。这个变量被成为标志,充当了程序的交通信号灯。你可以让程序在标志为True时继续运行,并在任何事件导致标志的值为False时让程序停止运行。这样,在while语句中就只需要检查一个条件——标志的当前值是否为True,并将所有测试(是否发生了应将标志设置为False的事件)都放在其他地方,从而让程序变得更为整洁。

prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "
active = True
while active:
    message = input(prompt)
    if message == 'quit':
        active = False
    else:
        print(message)

在这个例子中添加了一个active标志,简化了while语句,因为不需要在其中做任何的比较,相关的逻辑由程序的其他部分处理。只要active的值为True,循环就会一直运行;而当程序运行到某一刻时将active的值改为了False,循环就终止。使用标志可以使得后期修改程序变得更简单容易。

(4)使用break退出循环

要立即退出while循环,不再运行循环中余下的代码,也不管条件测试的结果如何,可使用break语句。它用于控制程序流程。

prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "
while True:
    message = input(prompt)
    if message == 'quit':
        break
    else:
        print(message)
# 输出:

Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Hello
Hello

Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. quit

以True作为条件测试的while循环将不断运行,直到遇到break语句。在任何的Python循环中都可以使用break语句。

(5)在循环中使用continue

要返回到循环的开头,并根据条件测试结果决定是否继续执行循环,可使用continue语句,它与break不一样,它只是退出了当次的循环,然后继续执行下一次循环;而break是直接退出整个循环。

current_number = 0
while current_number < 10:
    current_number += 1
    if current_number % 2 == 0:
        continue
    print(current_number)
# 输出:
1
3
5
7
9

这里只输出了1到10之间的奇数,因为每当遇到偶数时都碰到了continue语句,使其退出了那一次的循环。

(6)避免无限循环

在while循环中,其中自增自减的语句时必不可少的,一旦写漏了,就会出现无限循环。要避免编写无限循环,务必对每个while循环进行测试,确保它按预期那样结束。

3、使用while循环来处理列表和字典

for循环是一种遍历列表的有效方式,但在for循环中不应修改列表,否则将导致Python难以跟踪其中的元素。要在遍历列表的同时对其进行修改,可使用while循环。

(1)在列表之间移动元素

使用一个while循环,在验证用户的同时将其从未验证用户用户列表中提取出来,再将其加入到另一个已验证用户列表中。

unconfirm_users = ['alice', 'brian', 'candace']
confirm_users = []
while unconfirm_users:
    current_user = unconfirm_users.pop()
    print("Verifying user: " + current_user.title())
    confirm_users.append(current_user)
print("\nThe following users have been confirmed: ")
for confirm_user in confirm_users:
    print(confirm_user.title())
# 输出:
Verifying user: Candace
Verifying user: Brian
Verifying user: Alice

The following users have been confirmed: 
Candace
Brian
Alice
(2)删除包含特定值的所有列表元素

我们已经知道remove()可以删除列表中与之匹配的第一个元素,而当有多个相同的元素出项在列表中时,可以使用while循环来删除所有特定的值。

pets = ['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
print(pets)
while 'cat' in pets:
    pets.remove('cat')
print(pets)
# 输出:
['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
['dog', 'dog', 'goldfish', 'rabbit']
(3)使用用户输入来填充字典

使用while循环来创建一个调查程序,并将收集的数据存储在一个字典中,用户的名字就是键,用户的回答就是值。最后打印调查结果。

responses = {}
polling_active = True
while polling_active:
    name = input("\nWhat is your name? ")
    response = input("Which mountain would you like to climb someday? ")
    responses[name] = response
    repeat = input("Would you like to let another person respond?(yes/no) ")
    if repeat == 'no':
        polling_active = False
print("\n--- Poll Result ---")
for name, response in responses.items():
    print(name + " would like to climb " + response + ".")
# 输出:
What is your name? Eric
Which mountain would you like to climb someday? Denali
Would you like to let another person respond?(yes/no) yes

What is your name? Lynn
Which mountain would you like to climb someday? Devil's Thumb
Would you like to let another person respond?(yes/no) no

--- Poll Result ---
Eric would like to climb Denali.
Lynn would like to climb Devil's Thumb.
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • 提心吊胆要“点评”~21天充电行动(十六) 一.缘起 半个月前已在微信群中见到了“寒假小讲师公开赛”的预告,心中暖...
    N1124王双凤阅读 244评论 0 2
  • 姓名:张跃 公司:本一设计 【日精进打卡第28天】 【知-学习】 《六项精进》大纲0遍共12遍 《大学》背诵2遍 ...
    小小蛋儿阅读 143评论 0 0
  • 今天是2018年1月25日 是【晓晖有话说】陪伴你的第三百九十一天 山亭秋色满, 岩牖凉风度。 疏兰尚染烟, 残菊...
    晖晖晓阅读 390评论 0 0