用户输入和while循环
1.函数input()的工作原理
函数input()让程序暂停运行,等待用户输入一些文本。获取用户输入后。Python将其存储到一个变量中。
name = input("What's your name?")
print ("Hello " + name.title())
结果
What's your name?"dana"
Hello Dana
函数input()接收一个参数,即要向用户显示的提示或者说明,让用户知道该如何做。在这个示例中,Python运行第一行代码的时候,用户将看到提示What’s your name?。程序等待用户输入,并在用户回车后继续运行。输入的"dana"被存储在name这个变量中。接下来将输出呈现给用户。
1.1 使用int获取数值输入
使用函数input()时,需要注意的一点是,当你想要输入字符串的时候要显示的告诉Python你输入的是字符串。也就是需要""。下面来对比一下正确和错误的使用
age = input("How old are you?")
print ("age:" + str(age))
结果
How old are you?16
age:16
函数str()是把其他类型转换为字符串类型。在这里把int类型的16转换为了字符串的16。如果不进行转换会出现什么情况呢?
age = input("How old are you?")
print ("age:" + age)
结果
How old are you?16
Traceback (most recent call last):
File "hello_python.py", line 2, in <module>
print ("age:" + age)
TypeError: cannot concatenate 'str' and 'int' objects
Python解释器会提示不能把字符串类型和整形进行拼接。
那反过来如何把字符串类型的数字转换为整形呢?接下来看一下错误示例,这在编写代码时也是经常粗心犯的错误。
age = input("How old are you?")
print (16 == age)
结果
How old are you?"16"
False
这个输入的是"16",为什么和程序中的16不相等呢?答案就是我输入的是字符串类型的16,而和它比较的是整形的16.所以它俩并不相等。
age = input("How old are you?")
print (16 == int(age))
结果
How old are you?"16"
True
在这里,输入了字符串类型的16。但是在比较的时候,先将age变量存储的"16"转换为了整形的16。这样比较它俩就是相等的了。这有些类似有java语言中的强类型。但是在Python中,变量是不需要声明类型的。这一点很方便。但是再使用的时候,也需要特别注意。
1.2 求模运算
处理数值信息时,求模运算符(%)是一个很有用的工具,也就是两个数相除并返回余数。
print 4 % 3
print 5 % 3
print 10 % 2
print 11 % 2
结果
1
2
0
1
可以看到,在使用print()函数时,省略了括号,这也是准许的,在今后的代码中都将省略print()函数的括号。
求模运算符不会指出一个数是另一个数的多少倍,而只是指出余数是多少。
2.while循环简介
for循环用于针对集合中的每个元素的一个代码块,而while循环不断的运行,直到指定的条件不满足位置。
2.1 使用while循环
下面是一个简单的while循环示例
number = 1
while number < 10:
print number
number += 1
结果
1
2
3
4
5
6
7
8
9
上述代码在第一行声明了变量number 为1。接下来定义while循环代码块,首先判定变量number是否小于10,如果小于10,那么进入循环体,接下来打印当前变量number的值,最后然number所指代的值进行加一操作。然后再判定变量number所指代的值。知道判定行为为false。程序结束。
有时候while会这么使用
number = 1
while True:
print number
这快代码将会无线的循环,但是在有些程序中,例如循环等待用户输入,或者循环判定一个外部的变量,知道它的状态进行改变,才终止循环。
2.2 让用户选择何时退出
可使用while循环让程序在用户愿意时不断的运行,在用户想要退出时进行退出
name_message = "What's your name?"
quit_message = " enter 'quit' to end!"
end_message = "Bye"
message = ''
while message != "quit":
message = input(name_message)
if message != "quit":
print message.title() + quit_message
else:
print end_message
结果
What's your name?"david"
David enter 'quit' to end!
What's your name?"dana"
Dana enter 'quit' to end!
What's your name?"quit"
Bye
代码循环打印用户输入的名字,并打印用户的名字,同时告诉用户退出程序需要输入什么。
当用户输入"quit"时,进行了判断,只打印end_message所指代的字符串。
2.3 使用break退出循环
要立即退出while循环,不在运行循环中剩余的代码,也不管条件测试的结果如何,可使用break语句。break语句用于控制程序流程,可使用它来控制哪些代码将执行,哪些代码不执行,从而让程序按照你的要求执行你想要的代码。
改造上面的代码,这回使用 while True循环,让程序不断的循环,从内部进行中断循环。
name_message = "What's your name?"
quit_message = " enter 'quit' to end!"
end_message = "Bye"
message = ''
while True:
message = input(name_message)
if message != "quit":
print message.title() + quit_message
else:
print end_message
break
结果
What's your name?"dana"
Dana enter 'quit' to end!
What's your name?"quit"
Bye
注意:在任何Python循环中都可使用break语句。例如可使用break语句来退出遍历列表或字典的for循环。
2.4 在for循环中使用continue
要返回到循环开头,并根据条件测试结果决定是否继续执行循环,可使用continue语句,它不像break语句那样不再执行余下的代码并退出整个循环。例如,打印从1到10中的奇数。
number = 0
while number < 10:
number += 1
if number % 2 == 0:
continue
print number
结果
1
3
5
7
9
代码中,首先先number变量的指代值设置为0。接下来循环判定number指代值是否小于10,然后把number变量指代值进行自增+1。判定当前值进行与2的求模运算,结果是不是为0,为0则继续循环并忽略下面的代码。不为0则打印当前变量number指代的值。
2.5 避免无限循环
每个while循环都必须有停止运行的途径,这样才不会没完没了的执行下去。
要避免编写无限循环,务必对每个while循环进行测试,确保它按预期那样结束。如果你希望程序在用户输入特定的值时结束,可运行程序并输入这样的值。如果在这种情况下没有结束,请检查程序在处理这个值的方式,确认程序至少有一个这样的地方能让循环条件为False或让break语句可以得到执行。
例如上面代码中提到的while True,如果没有终止,将一直执行下去,这会很浪费计算机的物理资源。应尽量避免这种情况。但是有时候业务需要这样的轮训,但是要谨记正确的使用它。
3.使用while循环处理列表和字典
for循环是一种遍历列表的有效方式,但在for循环中不应修改列表,否则将导致Python难以跟中其中的元素。要在遍历列表的同时对其进行修改,可使用while循环。通过将while循环同列表和字典结合起来使用,可以处理大量的信息。
3.1 在列表之间移动元素
定义一个列表,将打于18的数字移动到另一个列表中
numbers = [2, 4, 5, 64, 16, 8, 100, 21, 16]
greater_than_eighteen_numbers = []
while numbers:
age = numbers.pop();
if 18 <= age:
greater_than_eighteen_numbers.append(age)
print greater_than_eighteen_numbers
结果
[21, 100, 64]
首先定义了一个numbers的列表,接下来对列表进行判断,判断列表中是否还有元素,有元素的话,就弹出最后一个元素,判定是否大于等于18,判定成功则放入greater_than_eighteen_numbers变量多指代的列表中。
3.2 删除包含特定值的所有列表中的元素
使用函数remove()来删除列表中的特定的值,之所以可行,是因为要删除的值在列表中只出现了一次。如果要删除列表中所有包含特定值的元素,该怎么办呢?
要删除所有这些元素,可不断运行一个while循环。
numbers = [16, 2, 4, 5, 64, 16, 8, 100, 21, 16, 16]
while 16 in numbers:
numbers.remove(16)
print numbers
结果
[2, 4, 5, 64, 8, 100, 21]
3.3 使用用户输入来填充字典
可使用while循环提示用户输入任意数量的值。
res = {}
# 设置一个标记位
survey_active = True
# 询问用户的姓名和喜欢的动物
while survey_active:
name = input("What's your name?")
like_animal = input("What animals do you like?")
res[name] = like_animal
is_continue = input("Is there anyone else?(yes/no)")
if is_continue == "no":
survey_active = False
for key, value in res.items():
print key + "\tlike\t" + value + "\n"
结果
What's your name?"dana"
What animals do you like?"dog"
Is there anyone else?(yes/no)"yes"
What's your name?"david"
What animals do you like?"cat"
Is there anyone else?(yes/no)"no"
dana like dog
david like cat
代码第一行定义了一个空的字典,第二行定义了循环的标记位,循环询问用户的名字和喜欢的动物并添加到字典中。然后询问用户是否还有其他人了。有的话继续循环询问。没有的话结束循环。之后打印字典中的键值对。
while循环的用处远不止于此。这只是演示了基础的用法,在今后的开发中多多练习。希望伙伴们都能有所进步。