Python学习笔记(1)For Loops for循环

Python for循环

学堂在线第三讲,简单算法

我们会发现当型循环通常在一系列选择中进行迭代。
通常,尤其在穷举法中,这一系列选择
是一个按照顺序的完整序列。
我们至今遇到的所有例子中,对象都是整数。
如果我们在一系列选择中完成那种迭代、那种循环,
Python将会提供一种非常有用特殊机制
来处理这一问题。
它被称为for循环。
for循环相关的语法。
它的形式如下:

for<identifier> in <sequence>:
   <code block>

这里有一些特殊标识符。
然后又是一些标识符。
这些标识符仅为名称,我将它们
放到角括号里,便于提示。
我们举个例子,将in输入其中,
那么,in就是关键词。
再往下是一些序列,即选择的集合,
以冒号结尾。
接下来缩进的便是代码块。
和往常一样,代码块的意义在于告诉我们接下来将要完成的任务。
以上便是for循环的格式。

接下来我们谈谈for循环背后蕴含的一些思想。

  • 在循环开始时,标识符最初会绑定到序列里的第一个值。
  • 接着运行代码块。
  • 运行结束后,标识符将会绑定到序列里的下一个值。
  • 运行代码块。

如果我们就此停下来了,你也许会感到焦虑不安。
你也许会问,我们难道不应该将序列中所有
可能的值都运行一遍吗?

答案是肯定的。
将会重复上述执行过程,直到序列中所有的值都已运行,或我遇到一个名叫break的特殊关键词。
当我遇到break语句时,它将引领我跳出for循环的计算,跳转到下一个代码片段。

所以break语句是一种基于测试结果提示我何时该跳出for循环的好办法。

好的。
接下来,我们花点时间看一个for循环的例子。

但是这就是它的基本原理。我只需操作运行一系列选择,直到我遇到测试并转到break,或者运行完所有可能的选项。

我还有另一个问题。
如果我想要生成一个整数序列,那我该怎么做呢?
我们可以用很多方法生成序列,但是在很多情况下,正如我们所遇到的,我们更愿意从0,1,2,3…这样的自然数序列出发来处理一切。
对于这一点,我们可以应用一个内置函数,range(n) [0,1,2,3,...,n-1]
range,以及它的参数n,请注意n位于
圆括号中间,将会为我们提供一个从0到n-1的自然数序列。
如果我想从其它数字开始整数序列,那我需要给定 range(m,n) = [m,m+1,...,n-1]
两个参数m和n。
它会给我m,m+1到n-1的整数序列。
基于上述两种原理,让我们来看看如果我们返回并清理之前求立方根的函数会怎样。
这是代码。

x=int(raw_input('Enter an integer:'))
 for ans in range(0,abs(x)+1):
       if ans**3 == abs(x):
           break
       if ans**3 != abs(x):
           print(str(x)+'is not a perfect cube') 
        else:
        		if x < 0:
        		   ans = -ans
        		 print('Cube root of' + str(x) + 'is' + str(ans) )

这和我们之前写的类似,但是它更为简洁。
这是好事。同样,程序需要我提供一个
需要运算的整数。
我会输入这个整数,同时通过类型转换等方法
确保它的数据类型是整型。
接下来注意这边的这个loop循环。
这是我的标识符,代表answer, ans,in。
这边是值域,请注意,它会做些什么。
它将生成一个整数序列,0,1,2一直到
x的绝对值。
这个for循环会在值域中从0开始搜寻答案,
执行循环体代码。

注意循环体格式。

循环体内部有一个测试,如果测试为真,那么break将出现。
我们的形式如下:

  • 序列生成环节。
  • 测试环节,或者可称为检验环节。

我将在0,1,2,3…直到x的
值域中依次搜寻答案。
一旦我越过了x,我将停止搜寻。
但是在循环内部,我也将进行检验。
如果当前值的立方正好等于x的绝对值,也就是我正苦苦搜寻的目标,那我的工作就圆满完成了。
break语句将会被触发。
break语句将会将我抛出循环,把我带到循环体之外的
下一个代码片段。
在那种情况下,我还要进行一次检验。
我为什么最后还要再进行一次检验呢?
好吧,事实上我并不确定到底是我是因为遇到了break语句而跳出循环,还是因为
运行完了整个值域里所有可能的值。
因此,我需要检验现在处于上述两种情况中的哪一种。
如果我是因运行了值域内的所有数值而结束循环–换句话说,
当前值的立方不是x的绝对值,就是说并不是因为检验测试而跳到当前位置,
我需要返回事实,即x不是一个完美的立方数。
否则,我将会继续我之前的工作。
确保我清楚我打算使用的是哪个符号,然后
将正确的结果输出。

现在让我们来做个检验测试吧。
在IDLE当中,这是我的代码。
它囊括了上述所有的代码。
现在如果我运行这段代码,它会要求我提供一个整数作为输入。
我将输入我的老朋友27.
结果出来了。

cube root of 27 is 3

让我们再试一遍。
让我们将x的值设定为-27。
结果确实是这样的。
让我们再试一遍。
让我们试一些更有趣的值吧。

好的。
我大概知道了那不是一个完美的立方数。
这确实是段相当高效的代码。

那么它到底做了什么?

  • 通过使用值域,它生成了一个穷举的序列。
  • 当我需要的时候,它会每次执行一个数值。
  • 在每一次执行循环内代码块时,它都将执行检验,以便验证是否已经发现了我想要搜寻的目标数值。

通过诸如此类的生成和检验的思想,我确实写出了能够有效完成目标数值搜寻任务的一小段代码。
当我们继续学习时,我们将会进一步依赖于这一思想。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python编程循环是非常常见和重要的数据处理方式。然而,Python的解释性语言特性,对循环的执行效率会有一定的影响。因此,在处理大量数据和复杂计算时,循环效率的提升显得尤为重要。下面从以下几个方面介绍如何提高Python for循环效率。 1.列表推导式 列表推导式是Python比较高效的列表生成方式,可以用快速生成列表。例如: ``` squares = [x**2 for x in range(10)] ``` 这个列表推导式相当于以下for循环: ``` squares = [] for x in range(10): squares.append(x**2) ``` 通过使用列表推导式,可以避免在循环使用append()方法将元素一个一个添加到列表的效率问题,从而提高for循环的效率。 2.使用range()函数代替enumerate()迭代器 在Python,enumerate()迭代器可以同时获取索引和元素。然而,在对于大量数据的处理过程,enumerate()迭代器效率较低。此时,可以使用Python自带的range函数来替代enumerate迭代器进行遍历,例如: ``` lst = ['a', 'b', 'c', 'd', 'e'] for i in range(len(lst)): print(i, lst[i]) ``` 3.尽量避免多重循环和嵌套 在Python,多重循环(nested loops)和嵌套会增加时间复杂度,导致程序效率变低。因此,在编写代码时,应该尽量避免多重循环和嵌套的情况,并尝试使用其他算法解决问题。 4.使用map()和filter()函数 Python的map()和filter()函数可以用来代替循环操作,从而实现高效的数据处理和计算。map()函数可以对序列每个元素进行操作,filter()函数可以对序列每个元素进行筛选。例如: ``` lst = [1, 2, 3, 4, 5] new_lst = list(map(lambda x: x**2, lst)) new_lst = list(filter(lambda x: x % 2 == 0, lst)) ``` 这里利用map()和filter()函数实现了对列表每个元素的平方和偶数筛选,从而避免了显式的循环操作。 总之,Python循环效率可以通过多种方式进行提高,例如列表推导式、range()函数代替enumerate()迭代器、避免多重循环和嵌套及使用map()和filter()函数等方法。在实际使用,我们应该根据情况选择合适的方法来提高程序的效率,从而减少计算时间和提高程序的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值