python入门(二)

For 循环

Python 有两种类型的循环:for 循环和 while 循环。for 循环用来遍历可迭代对象。

可迭代对象是每次可以返回其中一个元素的对象,包括字符串、列表和元组等序列类型,以及字典和文件等非序列类型。你还可以使用迭代器和生成器定义可迭代对象。

我们来了解下 for 循环的各个组成部分。请看下面的示例:

# iterable of cities
cities = ['new york city', 'mountain view', 'chicago', 'los angeles']

# for loop that iterates over the cities list
for city in cities:
    print(city.title())

For 循环的组成部分

  1. 循环的第一行以关键字 for 开始,表示这是一个 for 循环
  2. 然后是 iteration_variable in iterable,表示正在被遍历的是可迭代的对象,并且用迭代变量表示当前正在被处理的可迭代对象的元素。在此示例中,迭代变量 city 在第一次迭代时将是“new york city”,在第二次迭代时将是“mountain view。
  3. for 循环头部始终以英文冒号 : 结束。
  4. for 循环头部之后的是在此 for 循环的每次迭代时运行的缩进代码块。在此块中,我们可以使用迭代变量访问当前正在被处理的元素的值。

你可以随意命名迭代变量。常见模式是为迭代变量和可迭代对象指定相同的名称,但是分别使用单复数形式(例如 ‘city’ 和 ‘cities)

创建和修改列表

除了从列表中提取信息之外,你还可以使用 for 循环创建和修改列表。你可以在 for 循环的每次迭代时向新列表中添加元素,创建一个列表。如下所示。

# Creating a new list
cities = ['new york city', 'mountain view', 'chicago', 'los angeles']
capitalized_cities = []

for city in cities:
    capitalized_cities.append(city.title())

修改列表稍微复杂些,需要使用新的函数:range()

range() 是一个内置函数,用于创建不可变的数字序列。它有三个参数,必须都为整数。

range(start=0, stop, step=1)

Start是该序列的第一个数字,stop比该序列的最后一个数字大 1,step是该序列中每个数字之间的差。如果未指定的话,start默认为 0,step 默认为 1(即上述 =0和 =1)。

  • 如果你在 range() 的括号里指定一个参数,它将用作 ‘stop’ 的值,另外两个参数使用默认值。
    E.g. list(range(4)) 返回 [0, 1, 2, 3]
  • 如果你在 range() 的括号里指定两个参数,它们将用作 ‘start’ 和 ‘stop’ 的值,’step’ 将使用默认值。 E.g. list(range(2, 6)) 返回 [2, 3, 4, 5]
  • 或者你可以为三个参数 ‘start、stop’ 和 ‘step’ 均指定一个值。 E.g. list(range(1, 10, 2))返回 [1, 3, 5, 7, 9]

注意,在这些示例中,我们将 range 封装在列表中。因为 range 本身的输出是一个 range 对象。我们可以通过将其转换为列表或在 for 循环中遍历它,查看 range 对象中的值集合。

我们可以使用 range 函数为 cities 列表中的每个值生成索引。这样我们便可以使用 cities[index] 访问列表中的元素,以便直接修改 cities 列表中的值。

cities = ['new york city', 'mountain view', 'chicago', 'los angeles']

for index in range(len(cities)):
    cities[index] = cities[index].title()

虽然修改列表是 range 函数的一个用途,但是并非只有这一个用途。你将经常使用 range 和 for循环重复某个操作一定的次数。

for i in range(3):
    print("Hello!")

练习:创建用户名

写一个遍历 names 列表以创建 usernames 列表的 for 循环。要为每个姓名创建用户名,使姓名全小写并用下划线代替空格。对以下列表运行 for 循环:

names = ["Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]

应该会创建列表:

usernames = ["joey_tribbiani", "monica_geller", "chandler_bing", "phoebe_buffay"]

names = ["Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]
usernames = []

# write your for loop here
for name in names:
    usernames.append(name.lower().replace(' ','_'))
    

print(usernames)

假设我们不想创建新的列表,而是修改 names 列表本身,并编写以下代码。下面的代码有什么作用?

names = ["Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]

for name in names:
    name = name.lower().replace(" ", "_")

print(names)

这段代码没有效果。 在每次迭代时,name 变量设为从该列表中获取的一个字符串。然后赋值语句创建一个新的字符串 (name.lower().replace(" ", "_")) 并将 name 变量更改为该字符串。要修改该列表,你必须使用 range 对该列表本身操作

练习:使用 Range 修改用户名

写一个使用 range() 遍历 usernames 中的职位以修改该列表的 for 循环。和上一道练习一样,将每个姓名改成全小写形式并用下划线代替空格。运行 for 循环后,以下列表

usernames = ["Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]

应该更改为:

usernames = ["joey_tribbiani", "monica_geller", "chandler_bing", "phoebe_buffay"]

usernames = ["Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]

# write your for loop here
for index in range(len(usernames)):
    usernames[index]=usernames[index].lower().replace(' ','_')
    

print(usernames)

练习:标记计数器

写一个 for 循环,用于遍历字符串列表 tokens 并数一下有多少个 XML 标记。XML 是一种类似于 HTML 的数据语言。如果某个字符串以左尖括号“<”开始并以右尖括号“>”结束,则是 XML 标记。使用 count 记录这种标记的数量。

你可以假设该字符串列表不包含空字符串。

tokens = ['<greeting>', 'Hello World!', '</greeting>']
count = 0

# write your for loop here
for token in tokens:
    if token[0]=='<' and token[-1]=='>':
        count += 1

print(count)

练习:创建 HTML 列表

写一个 for 循环,用于遍历字符串列表并创建单个字符串 html_str,它是一个 HTML 列表。例如,如果列表是 items = ['first string', 'second string],输出 html_str 应该会输出:

<ul>
<li>first string</li>
<li>second string</li>
</ul>

即该字符串的第一行应该是起始标记 <ul>。然后是源列表中的每个元素各占一行,两边是 <li> 和 </li> 标记。该字符串的最后一行应该是结束标记 </ul>

items = ['first string', 'second string']

html_str = "<ul>\n" # "\ n" is the character that marks the end of the line, it does

# the characters that are after it in html_str are on the next line

# write your code here

for item in items:

html_str += "<li>{}</li>\n".format(item)

html_str +="</ul>"

print(html_str)

1111

While 循环

For 循环是一种“有限迭代”,意味着循环主体将运行预定义的次数。这与“无限迭代”循环不同,无限迭代循环是指循环重复未知次数,并在满足某个条件时结束,while 循环正是这种情况。下面是一个 while循环的示例。

card_deck = [4, 11, 8, 5, 13, 2, 8, 10]
hand = []

# adds the last element of the card_deck list to the hand list
# until the values in hand add up to 17 or more
while sum(hand)  <= 17:
    hand.append(card_deck.pop())

这个示例包含两个函数。sum 返回列表中的元素之和,pop 是一个列表方法,它会从列表中删除最后一个元素并返回该元素。

While 循环的组成部分

  1. 第一行以关键字 while 开始,表示这是一个 while 循环。
  2. 然后是要检查的条件。在此示例中是 sum(hand) <= 17
  3. while 循环头部始终以冒号 : 结束。
  4. 该头部之后的缩进部分是 while 循环的主体。如果 while 循环的条件为 true,该循环的主体将被执行。每次运行循环主体时,条件将被重新评估。这个检查条件然后运行循环的流程将重复,直到该表达式变成 false。

循环的缩进主体应该至少修改测试表达式中的一个变量。如果测试表达式的值始终不变,就会变成无限循环!

Zip 和 Enumerate

zip 和 enumerate 是实用的内置函数,可以在处理循环时用到。

Zip

zip 返回一个将多个可迭代对象组合成一个元组序列的迭代器。每个元组都包含所有可迭代对象中该位置的元素。例如,

list(zip(['a', 'b', 'c'], [1, 2, 3])) 将输出 [('a', 1), ('b', 2), ('c', 3)].

正如 range() 一样,我们需要将其转换为列表或使用循环进行遍历以查看其中的元素。

你可以如下所示地用 for 循环拆分每个元组。

letters = ['a', 'b', 'c']
nums = [1, 2, 3]

for letter, num in zip(letters, nums):
    print("{}: {}".format(letter, num))

除了可以将两个列表组合到一起之外,还可以使用星号拆分列表。

some_list = [('a', 1), ('b', 2), ('c', 3)]
letters, nums = zip(*some_list)

这样可以创建正如之前看到的相同 letters 和 nums 列表。

Enumerate

enumerate 是一个会返回元组迭代器的内置函数,这些元组包含列表的索引和值。当你需要在循环中获取可迭代对象的每个元素及其索引时,将经常用到该函数。

letters = ['a', 'b', 'c', 'd', 'e']
for i, letter in enumerate(letters):
    print(i, letter)

这段代码将输出:

0 a
1 b
2 c
3 d
4 e

练习:组合坐标

使用 zip 写一个 for 循环,该循环会创建一个字符串,指定每个点的标签和坐标,并将其附加到列表 points。每个字符串的格式应该为 label: x, y, z。例如,第一个坐标的字符串应该为 F: 23, 677, 4

x_coord = [23, 53, 2, -12, 95, 103, 14, -5]
y_coord = [677, 233, 405, 433, 905, 376, 432, 445]
z_coord = [4, 16, -6, -42, 3, -6, 23, -1]
labels = ["F", "J", "A", "Q", "Y", "B", "W", "X"]

points = []
# write your for loop here
for label,x,y,z in zip(labels,x_coord,y_coord,z_coord):
    points.append(('{}: {}, {}, {}').format(label,x,y,z))

for point in points:
    print(point)

练习:将列表组合成字典

使用 zip 创建一个字典 cast,该字典使用 names 作为键,并使用 heights 作为值。

cast_names = ["Barney", "Robin", "Ted", "Lily", "Marshall"]
cast_heights = [72, 68, 72, 66, 76]

cast = dict(zip(cast_names,cast_heights))
print(cast)

练习:拆封元组

将 cast 元组拆封成两个 names 和 heights 元组。

cast = (("Barney", 72), ("Robin", 68), ("Ted", 72), ("Lily", 66), ("Marshall", 76))

# define names and heights here
names,heights=zip(*cast)
#m=list(zip(*cast))
#print(m)
print(names)
print(heights)

练习:用 Zip 进行转置

使用 zip 将 data 从 4×3 矩阵转置成 3×4 矩阵。实际上有一个很酷的技巧。

data = ((0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11))

data_transpose = tuple(zip(*data))
print(data_transpose)

练习:Enumerate

使用 enumerate 修改列表 cast,使每个元素都包含姓名,然后是角色的对应身高。例如,cast 的第一个元素应该从 "Barney Stinson" 更改为 "Barney Stinson 72”

cast = ["Barney Stinson", "Robin Scherbatsky", "Ted Mosby", "Lily Aldrin", "Marshall Eriksen"]
heights = [72, 68, 72, 66, 76]

# write your for loop here
for i,c in enumerate(cast):
    cast[i]=c +' '+str(heights[i])

print(cast)

练习解决方案:生成消息

下面是实现该程序的一种方式!

names = input("Enter names separated by commas: ").title().split(",")
assignments = input("Enter assignment counts separated by commas: ").split(",")
grades = input("Enter grades separated by commas: ").split(",")

message = "Hi {},\n\nThis is a reminder that you have {} assignments left to \
submit before you can graduate. You're current grade is {} and can increase \
to {} if you submit all assignments before the due date.\n\n"

for name, assignment, grade in zip(names, assignments, grades):
    print(message.format(name, assignment, grade, int(grade) + int(assignment)*2))

此处names 等都是列表。

列表推导式

在 Python 中,你可以使用列表推导式快速简练地创建列表。下面是之前的一个示例:

capitalized_cities = []
for city in cities:
    capitalized_cities.append(city.title())

可以简写为:

capitalized_cities = [city.title() for city in cities]

借助列表推导式,我们可以使用 for 循环用一步创建一个列表。

我们使用方括号 [] 创建列表推导式,括号里包含要对可迭代对象中的每个元素进行评估的条件。上述列表推导式对 cities 中的每个元素 city 调用 city.title(),以为新列表 capitalized_cities 创建每个元素。

列表推导式中的条件语句

你还可以向列表推导式添加条件语句。在可迭代对象之后,你可以使用关键字 if 检查每次迭代中的条件。

squares = [x**2 for x in range(9) if x % 2 == 0]

上述代码将 squares 设为等于列表 [0, 4, 16, 36, 64],因为仅在 x 为偶数时才评估 x 的 2 次幂。如果你想添加 else,将遇到语法错误。

squares = [x**2 for x in range(9) if x % 2 == 0 else x + 3]

如果你要添加 else,则需要将条件语句移到列表推导式的开头,直接放在表达式后面,如下所示。

squares = [x**2 if x % 2 == 0 else x + 3 for x in range(9)]

列表推导式并没有在其他语言中出现,但是在 python 中很常见。

练习:提取名字

使用列表推导式创建新的列表 first_names,其中仅包含 names 中的名字(小写形式)。

names = ["Rick Sanchez", "Morty Smith", "Summer Smith", "Jerry Smith", "Beth Smith"]

first_names = [name.split(' ')[0].lower() for name in names]
print(first_names)

练习:按得分过滤姓名

使用列表推导式创建一个 passed 的姓名列表,其中仅包含得分至少为 65 分的名字。

scores = {
             "Rick Sanchez": 70,
             "Morty Smith": 35,
             "Summer Smith": 82,
             "Jerry Smith": 23,
             "Beth Smith": 98
          }

passed = [name for name,score in scores.items() if score>=65]
print(passed)

输出:

该输出中的元素顺序可能有变化,因为字典是无序的。

['Beth Smith', 'Summer Smith', 'Rick Sanchez']

 

    原文作者:ZLuby
    原文地址: https://blog.csdn.net/weixin_38300566/article/details/85625544
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞