关于016讲的动动手1答案
list1 = ['asd','fgh','jkl',1,3,5,7,9.6,4.7,2.8]for each in list1:
if (type(each) != int) and (type(each) != float):
list1.remove(each)
sum(list1)
当时我是这么乱写的。。。结果果然不行{:10_292:} 但是不知道该怎么改。。。
还有就是答案的第一行def sum(x)是什么呢。。。
本帖最后由 geen 于 2019-7-16 01:06 编辑
list1 = ['asd','fgh','mmm','xxx','jkl','jj','kk','pp',1,3,5,7,9.6,4.7,2.8] #增加多个字符串,方便观察总结异常情况的规律。
print(list1) #插入了检测代码,原列表作为参照对比。
for each in list1: #结论:在这里修改,把list1改为list1[:],就能正常输出。
print(each) #插入了检测代码
if (type(each) != int) and (type(each) != float):#应该用and。
list1.remove(each)
print(list1)#插入了检测代码
print(list1) #插入了检测代码,观察最终列表里有什么?
输出结果:
['asd', 'fgh', 'mmm', 'xxx', 'jkl', 'jj', 'kk', 'pp', 1, 3, 5, 7, 9.6, 4.7, 2.8]
asd (说明:第1个字符串被执行remove())
['fgh', 'mmm', 'xxx', 'jkl', 'jj', 'kk', 'pp', 1, 3, 5, 7, 9.6, 4.7, 2.8]
mmm (说明:第3个字符串被执行remove())
['fgh', 'xxx', 'jkl', 'jj', 'kk', 'pp', 1, 3, 5, 7, 9.6, 4.7, 2.8]
jkl (说明:第5个字符串被执行remove())
['fgh', 'xxx', 'jj', 'kk', 'pp', 1, 3, 5, 7, 9.6, 4.7, 2.8]
kk (说明:第7个字符串被执行remove())
['fgh', 'xxx', 'jj', 'pp', 1, 3, 5, 7, 9.6, 4.7, 2.8]
1
3
5
7
9.6
4.7
2.8
['fgh', 'xxx', 'jj', 'pp', 1, 3, 5, 7, 9.6, 4.7, 2.8] (说明:由于列表里包括字符串和int、float类型,所以无法执行sum()操作。 )
>>>
由输出结果可以得出规律:字符串都是隔了1个才被remove(),造成这个原因:因为被迭代对象list1一边被迭代,一边被修改,当进入下一个循环的时候是新的list1了,但是each已经被执行过一次(迭代了一次),所以在下一个循环的时候执行 [ [新的list1] 的下一个each值],也就得出了间隔一个字符串的结果。做法错误的根本原因就是,不该在循环体内对被迭代对象进行修改操作(即一边迭代,又一边修改)。
查了帮助文档,的确和我猜想的一样,可以用list1[:]切片作为被迭代对象,就能解决问题了。
本帖最后由 jinlovelive 于 2019-7-15 13:11 编辑
是让你重新编写sum函数,你不重新定义的话,调用sum,遇到字符串还是会报错
def sum(list1):
sum_num = 0
for each in list1:
if type(each) == int or type(each) == float:
sum_num = sum_num + each
return sum_num
list1 = ['asd','fgh','jkl',1,3,5,7,9.6,4.7,2.8]
list_sum = sum(list1)
print(list_sum)
>>>
======================== RESTART: F:\学习资料\py\ceshi.py ========================
33.1
>>> >>> help('for')
The "for" statement
*******************
The "for" statement is used to iterate over the elements of a sequence
(such as a string, tuple or list) or other iterable object:
for_stmt ::= "for" target_list "in" expression_list ":" suite
["else" ":" suite]
The expression list is evaluated once; it should yield an iterable
object.An iterator is created for the result of the
"expression_list".The suite is then executed once for each item
provided by the iterator, in the order returned by the iterator.Each
item in turn is assigned to the target list using the standard rules
for assignments (see Assignment statements), and then the suite is
executed.When the items are exhausted (which is immediately when the
sequence is empty or an iterator raises a "StopIteration" exception),
the suite in the "else" clause, if present, is executed, and the loop
terminates.
A "break" statement executed in the first suite terminates the loop
without executing the "else" clause’s suite.A "continue" statement
executed in the first suite skips the rest of the suite and continues
with the next item, or with the "else" clause if there is no next
item.
The for-loop makes assignments to the variables(s) in the target list.
This overwrites all previous assignments to those variables including
those made in the suite of the for-loop:
for i in range(10):
print(i)
i = 5 # this will not affect the for-loop
# because i will be overwritten with the next
# index in the range
Names in the target list are not deleted when the loop is finished,
but if the sequence is empty, they will not have been assigned to at
all by the loop.Hint: the built-in function "range()" returns an
iterator of integers suitable to emulate the effect of Pascal’s "for i
:= a to b do"; e.g., "list(range(3))" returns the list "".
Note: There is a subtlety when the sequence is being modified by the
loop (this can only occur for mutable sequences, i.e. lists).An
internal counter is used to keep track of which item is used next,
and this is incremented on each iteration.When this counter has
reached the length of the sequence the loop terminates.This means
that if the suite deletes the current (or a previous) item from the
sequence, the next item will be skipped (since it gets the index of
the current item which has already been treated).Likewise, if the
suite inserts an item in the sequence before the current item, the
current item will be treated again the next time through the loop.
This can lead to nasty bugs that can be avoided by making a
temporary copy using a slice of the whole sequence, e.g.,
for x in a[:]:
if x < 0: a.remove(x)
Related help topics: break, continue, while
>>>
翻译:
“for”声明
*******************
“for”语句用于迭代序列的元素
(例如字符串,元组或列表)或其他可迭代对象:
“expression_list”中的for_stmt :: =“for”target_list“:”suite
[“else”“:”套房]
表达式列表评估一次;它应该产生一个可迭代的
宾语。为结果创建一个迭代器
“expression_list”。然后为每个项目执行一次套件
由迭代器提供,按迭代器返回的顺序提供。每
依次使用标准规则将项目分配给目标列表
对于赋值(参见赋值语句),然后是套件
执行。当物品耗尽时(这是当时的物品)
sequence为空或迭代器引发“StopIteration”异常),
“else”子句中的套件(如果存在)被执行,并且循环
终止。
在第一个套件中执行的“break”语句终止循环
不执行“else”子句的套件。一个“继续”的声明
在第一个套件中执行,跳过套件的其余部分并继续
如果没有下一个项目,则使用下一个项目,或使用“else”子句
项目。
for循环对目标列表中的变量进行赋值。
这会覆盖以前对这些变量的所有分配,包括
在for-loop套件中制作的:
我在范围内(10):
打印(I)
i = 5#这不会影响for循环
#因为我将被下一个覆盖
范围内的#index
循环结束时,不会删除目标列表中的名称,
但如果序列为空,则不会将它们分配给
所有的循环。提示:内置函数“range()”返回一个
整数的迭代器适合模仿Pascal的“对我的影响”
:= a到b do“;例如,”list(range(3))“返回列表”“。
注意:当序列被修改时,有一个微妙的
循环(这只能发生在可变序列,即列表中)。一个
内部计数器用于跟踪下一个使用的项目,
并且这在每次迭代时递增。当这个柜台有
达到循环终止的序列长度。这意味着
如果套件删除了当前(或前一个)项目
序列,将跳过下一个项目(因为它获得索引)
已经处理过的当前项目)。同样,如果
套件在当前项目之前的序列中插入项目
下一次循环将再次处理当前项目。
这可能导致令人讨厌的错误,可以通过制作一个
使用整个序列的切片进行临时复制,例如,
对于[:]中的x:
如果x <0:a.remove(x)
相关帮助主题:break,continue,while
jinlovelive 发表于 2019-7-15 13:07
是让你重新编写sum函数,你不重新定义的话,调用sum,遇到字符串还是会报错
>>>
感谢您的帮助{:10_340:}可是,第一行的def sum(list1)是什么意思呢?{:10_284:} geen 发表于 2019-7-15 12:39
输出结果:
['asd', 'fgh', 'mmm', 'xxx', 'jkl', 'jj', 'kk', 'pp', 1, 3, 5, 7, 9.6, 4.7, 2.8] ...
谢谢您,用列表切片作为新的迭代对象这个方法太巧妙了{:10_292:}我完全想不到{:10_266:} 水煮齐国大夫 发表于 2019-7-16 09:20
谢谢您,用列表切片作为新的迭代对象这个方法太巧妙了我完全想不到
def sum(list1):这个是自定义一个函数(sum()),参数是list1,,回去再看一遍视频吧。 geen 发表于 2019-7-15 12:39
输出结果:
['asd', 'fgh', 'mmm', 'xxx', 'jkl', 'jj', 'kk', 'pp', 1, 3, 5, 7, 9.6, 4.7, 2.8] ...
请问你说的切片是怎么切的呢?看到你的答案确实长知识,但是你说的解决办法还是没看懂,能否解释下?谢谢,路人留言{:5_109:} MMM啊 发表于 2019-7-16 09:57
请问你说的切片是怎么切的呢?看到你的答案确实长知识,但是你说的解决办法还是没看懂,能否解释下?谢谢 ...
切片就是复制的意思,并且不受原变量的影响(无论原变量变不变)。list1的切片格式是list1,a,b可以是下标,也可以为空。a为空就是等于0,从头开始复制,b为空,就是末尾的意思。 geen 发表于 2019-7-16 09:30
def sum(list1):这个是自定义一个函数(sum()),参数是list1,,回去再看一遍视频吧。
我在下一讲里面看到了{:10_266:}谢谢您的帮助{:10_254:} geen 发表于 2019-7-16 10:03
切片就是复制的意思,并且不受原变量的影响(无论原变量变不变)。list1的切片格式是list1,a,b可以 ...
我懂了,你是说用切片但是不设置间距,所以每次就会复制一下那个剩余的列表,然后就可以避免每次都隔一个数了,谢谢!
页:
[1]