GVKun编程网logo

Pythonic:范围与枚举在Python for循环中(python的枚举和for循环)

17

在本文中,我们将给您介绍关于Pythonic:范围与枚举在Pythonfor循环中的详细内容,并且为您解答python的枚举和for循环的相关问题,此外,我们还将为您提供关于07_Python的控制判

在本文中,我们将给您介绍关于Pythonic:范围与枚举在Python for循环中的详细内容,并且为您解答python的枚举和for循环的相关问题,此外,我们还将为您提供关于07_Python的控制判断循环语句1(if判断for循环)_Python编程之路、For循环-类似于Python范围函数、for循环中到底发生了什么--Python提高班、For循环中的Python列表的知识。

本文目录一览:

Pythonic:范围与枚举在Python for循环中(python的枚举和for循环)

Pythonic:范围与枚举在Python for循环中(python的枚举和for循环)

您能否告诉我为什么在遍历列表并使用时需要索引和值时将其视为“非pythonic”:

a = [1,2,3]for i in range(len(a)):  # i is the idx  # a[i] is the value

但建议使用

for idx, val in enumerate(a):  print idx, val

谁定义了“ pythonic”,为什么后者更好?我的意思是说,关于可读性不是更好吗?

提前致谢

答案1

小编典典

首先,第一种方法很难看:您要么需要单独的变量分配来获取元素,要么一直使用a[i],这从 理论上讲
可能是一项昂贵的操作。想象一下a,作为数据库游标:对其进行迭代(a.__iter__被调用)时,对象可以安全地假定您将对其所有项目进行迭代。因此,可以一次检索全部或至少多个行。当获得长度时,这样的优化将是愚蠢的,尽管您肯定不希望仅由于需要项数而检索数据。同样,在检索特定项目时,您不能假定也将检索其他项目。

此外,使用enumerate()与作品 可迭代的 ,而range(len())只适用于 可数,可转位 对象。

07_Python的控制判断循环语句1(if判断for循环)_Python编程之路

07_Python的控制判断循环语句1(if判断for循环)_Python编程之路

Python的数据类型在前几节我们都简单的一一介绍了,接下来我们就要讲到Python的控制判断循环语句

 

在现实编程中,我们往往要利用计算机帮我们做大量重复计算的工作,在这样的情况下,需要机器能对某个条件进行判断,或是对某个行为进行重复操作

这时我们就必须要知道如何去编写循环判断语句

 

if... elif... else

if也就是如果的意思,后面需要加一个判断条件,如果判断条件为真,则执行if下的操作,如果为假则跳过操作

注意在每个判断条件后面要加上冒号,且if下面的语句要注意缩进

In [1]: num = 20

In [2]: if num > 10:
   ...:     print("条件成立")
   ...:     
条件成立

  

tips:“ = ”  和 “ == ”的区别:一般的一个等号代表的是赋值,在循环中只能用来和对象名进行比较,“ == ”双等号可以直接用来与值进行比较,例如数字,和字符串

例如

In [3]: name = "susmote"  

In [4]: if name == "susmote":
   ...:     print("名字是susmote")
   ...:     
名字是susmote

In [5]: if name = "susmote":         #如果不用“==”比较值,则会报语法错误
   ...:     print("名字是susmote")
   ...:     
  File "<ipython-input-5-06510f3ebd56>", line 1
    if name = "susmote":
            ^
SyntaxError: invalid syntax

 其他的关系运算符如下

大于等于  >=

小于等于 <=  

 

elif在其他语言中叫 “ else if ”,python简化了这个表达式,elif一般是用来判断多个表达式的,也就是说在一个判断语句中可以有多elif,这个也有点类似于其他语言的switch case,当然也要加上else

In [8]: num = 20

In [9]: if num > 20:
   ...:     print("num大于20")
   ...: elif num == 20:
   ...:     print("num等于20")
   ...: elif num < 20:
   ...:     print("num小于20")
   ...:       
num等于20

  

else下面的执行语句只有当前面的条件都不满足时,才会执行,else在一个判断语句中也是可选的,但为了程序能更清晰的运行,建议还是都加上

一个完整的if,, elif ... else语句

num = input("请输入一个不大于5的数:  ")
num = int(num)
if num == 0:
        print("这个数字是0")
elif num == 1:
        print("这个数字是1")
elif num == 2:
        print("这个数字是2")
elif num == 3:
        print("这个数字是3")
elif num == 4:
        print("这个数字是4")
elif num == 5:
        print("这个数字是5")
else :
        print("你输入的数不符合要求")

  运行结果

[root@localhost ~]# python3 a.py 
请输入一个不大于5的数:  3
这个数字是3
[root@localhost ~]# python3 a.py 
请输入一个不大于5的数:  14
你输入的数不符合要求

 

while

while循环的正确定义是 while()   括号里面需要加一个判断条件,如果里面的判断为真,则一直执行下面的语句,知道while的判断条件为假才跳出循环

In [1]: num = 10

In [2]: while(num > 0 ):
   ...:     print(num)
   ...:     num -= 1
   ...:     
10
9
8
7
6
5
4
3
2
1

  

 

当然如果条件一直为真则形成死循环,里边的语句一直会执行,一般程序还是尽量不要出现死循环,死循环很耗系统资源

在这里讲一下条件判断中常用的布尔类型:

布尔类型只有真和假两个值,True or Flase

一般所有的字符串都代表真,数字中只有0是代表假 false

In [15]: while(0):
    ...:     print("条件为假,什么都不做")
    ...:

  

for

for循环在其他语言中,如C,java,只能通过数字进行循环迭代,Python中你可以对任意有顺序的数据进行for循环获取值,如列表和字符串

python中for循环的语句结构    for  item in sequence       item代表获取到的每个值,sequence代表可循环的数据,列表或字符串

例如

In [16]: info = ["susmote", "18", "13488888888"]

In [17]: for item in info:
    ...:     print(item)
    ...:     
susmote
18
13488888888

  

 

如果是操作一个列表的话,你还可以对他进行其他的改变,如通过for循环对列表内元素进行排序(最原始的办法,一个个判断)

In [28]: for i in num:
    ...:     if i < num[0]:
    ...:         num.remove(i)
    ...:         num.insert(0, i)
    ...:     elif i < num[1]:
    ...:         num.remove(i)
    ...:         num.insert(1,i)
    ...:     elif i < num[2]:
    ...:         num.remove(i)
    ...:         num.insert(2, i)
    ...:     elif i < num[3]:
    ...:         num.remove(i)
    ...:         num.insert(3, i)
    ...:     elif i < num[4]:
    ...:         num.remove(i)
    ...:         num.insert(4,i)
    ...:         

In [29]: num
Out[29]: [1, 3, 5, 6, 7, 9]

  后续在讲排序算法

 

range()

如果你需要重复的生成一组有规律的数字,这时你就需要用到range函数了,他能够生成递进的数字

例如与for循环结合

In [34]: for i in range(5):
    ...:     print(i)
    ...:     
0
1
2
3
4

  默认是从0开始迭代生成的

range可以传三个参数  range( a, b ,c )        a代表开始的数字,b代表结束的数字,c代表增量(可为负数)

调用range方法时只传一个参数,a默认为0, b则是你传入的参数,c默认为1

调用range方法时传两个参数,a就是第一个参数,b是后面一个参数,c默认为1,  记住包头不包尾

例如

In [42]: for i in range(2, 6):
    ...:     print(i)
    ...:     
2
3
4
5

In [43]: for i in range(2, 10, 2):
    ...:     print(i)
    ...:     
2
4
6
8

  

当然也可以为负数

In [44]: for i in range(-10, -80, -10):
    ...:     print(i)
    ...:     
-10
-20
-30
-40
-50
-60
-70

  

对于一个列表,你还可以遍历他的索引,获取值

In [45]: weekdays = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunda
    ...: y"]

In [46]: for i in range(len(weekdays)):
    ...:     print(i, weekdays[i])
    ...:     
0 Monday
1 Tuesday
2 Wednesday
3 Thursday
4 Friday
5 Saturday
6 Sunday

  

一般我们在进行上述操作时,为了更方便,我们都是使用 enumerate()方法的,他能直接迭代生成索引,这个之后再讲

range()返回的值不是一个列表,只是一个对象,我们把这种对象叫做可迭代对象

我们不仅能够通过for循环输出对象迭代的值,还能直接通过 list() 直接生成列表

In [47]: print(range(10))
range(0, 10)

In [48]: list(range(10))
Out[48]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

  

 

For循环-类似于Python范围函数

For循环-类似于Python范围函数

我想知道在Java中是否有像python range函数这样的函数。

range(4)

它会返回

[0,1,2,3]

这是进行增强循环的一种简便方法。用Java做到这一点将是很棒的,因为它将使for循环容易得多。这可能吗?

for循环中到底发生了什么--Python提高班

for循环中到底发生了什么--Python提高班

我们都知道for in在代码中出现的次数相当的频繁, 那么你知道for in循环中到底发生了什么吗?

答: 当我们调用一个for x in dataContainer的时候, 实际上是先调用了dataContainer__iter__()方法来获得它的iterator(迭代器), 然后不断的调用next()方法, Python3.x里面是__next__(), 直到迭代器抛出StopIteration的异常, 停止

什么是iterable和iterator

上一篇如何理解yield中已经对interable已经略有介绍, 我们可以简单的认为可以使用for in的都是iterable的, 但是这只是从使用场景来说的, 下面就从它内部来说下

  • iterable: 如果一个数据容器定义了一个__iter__()方法, 那么它就是可迭代的
  • iterator: 如果一个object支持迭代协议, 也就是: 1. 定义一个__iter__返回它自身 2. 定义一个next()方法, 每次被调用的时候返回下一个值

很明显list dictiterable的, 但它不是iterator

>>> a = [1,2,3]
>>> a.__iter__
<method-wrapper ''__iter__'' of list object at 0x2ad2cf8>
>>> a.next()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: ''list'' object has no attribute ''next''

但是通过__iter__获得的就是它们的iterator迭代器

>>> ai = a.__iter__()
>>> ai
<listiterator object at 0x2dfe310>
>>> ai.next()
1
>>> ai.__iter__() is ai
True

如何构建iterable的容器

class MyList(list):
    def __iter__(self):
        return MyListIter(self)

class MyListIter(object):
    """一个实现List的Iterator的 Demo Class"""
    def __init__(self, lst):
        self.lst = lst
        self.i = -1
    def __iter__(self):
        return self
    def next(self):
        if self.i<len(self.lst)-1:
            self.i += 1         
            return self.lst[self.i]
        else:
            raise StopIteration

if __name__ == ''__main__'':
    a = MyList([1, 2, 3, 4])
    ia = iter(a)
    print ''type(a): %r, type(ia): %r'' %(type(a), type(ia))
    for i in a: 
        print i,

上面的一段代码中 MyListIter 就实现了 MyList的迭代器, 运行结果应该是

type(a): <class ''__main__.MyList''>, type(ia): <class ''__main__.MyListIter''>
1 2 3 4

如何把我们的变量iterable

比如我们有一个需求, 需要返回所有0~4中数字和a~e中字母组合情况, 一般我们可能会这样写

class Combinations:
    def __init__(self):
        self.combs = []
        for x in range(5):
            for y in [''a'', ''b'', ''c'', ''d'', ''e'']:
                self.combs.append("%s%s" % (x, y))

for c in Combinations().combs: print c

这样的话, 我们每次都要调用Combinations的''combs''才能拿到所有的组合情况, 显然每次暴露combs出来非常的不优雅, 为什么不能for c in Combinations()这样呢?

当然可以, 定义一个__iter__方法返回combs的迭代器就可以了

class Combinations:
    def __init__(self):
        self.combs = []
        for x in range(5):
            for y in [''a'', ''b'', ''c'', ''d'', ''e'']:
                self.combs.append("%s%s" % (x, y))
    def __iter__(self):
        return iter(self.combs)

for c in Combinations(): print c

参考: Understanding Python Iterables and Iterators

For循环中的Python列表

For循环中的Python列表

我是Python的新手,并且有一个关于使用for循环更新列表的问题。这是我的代码:

urls = ['http://www.city-data.com/city/javascript:l("Abbott");','http://www.city-data.com/city/javascript:l("Abernathy");','http://www.city-data.com/city/Abilene-Texas.html','http://www.city-data.com/city/javascript:l("Abram-Perezville");','http://www.city-data.com/city/javascript:l("Ackerly");','http://www.city-data.com/city/javascript:l("Adamsville");','http://www.city-data.com/city/Addison-Texas.html']

for url in urls:
    if "javascript" in url:
        print url
        url = url.replace('javascript:l("','').replace('");','-Texas.html')
        print url

for url in urls:
    if "javascript" in url:
        url = url.replace('javascript:l("','-Texas.html')
print "\n"  
print urls

我使用了第一个for循环来检查语法是否正确,并且工作正常。但是第二个for循环是我要使用的代码,但是无法正常工作。如何使用第二个for循环全局更新列表,以便可以在for循环外打印或存储更新的列表?

关于Pythonic:范围与枚举在Python for循环中python的枚举和for循环的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于07_Python的控制判断循环语句1(if判断for循环)_Python编程之路、For循环-类似于Python范围函数、for循环中到底发生了什么--Python提高班、For循环中的Python列表的相关知识,请在本站寻找。

本文标签: