Crossin的编程教室

标题: 【Python 第15课】 循环的嵌套 [打印本页]

作者: crossin先生    时间: 2014-4-23 17:31
标题: 【Python 第15课】 循环的嵌套
设想一样,如果我们要输出5个*,用for循环要这么写
for i in range(0, 5):
    print '*'

如果想让这5个*在同一行,就在print语句后面加上逗号
for i in range(0, 5):
    print '*',

但如果我想要这样一个图形,怎么办?
* * * * *
* * * * *
* * * * *
* * * * *
* * * * *

当然,你可以循环5次,每次输出一行“* * * * *”。那如果再进一步,这样呢?
*
**
***
****
*****

除了你自己动手打好一个多行字符串外,也可以让程序帮我们解决这种问题,我们需要的是两个嵌套在一起的循环:
for i in range(0, 5):
    for j in range(0, 5):
        print i, j

第二个for循环在第一个for循环的内部,表示每一次外层的循环中,都要进行一遍内层的循环。
看一下输出的结果:
0 0
0 1
0 2
0 3
0 4
1 0
...
4 4
内层循环中的print语句一共被执行了25次。
i从0到4循环了5次。对应于每一个i的值,j又做了从0到4五次循环。所以5*5一共25次。

所以如果要输出一个5*5的方阵图案,我们可以
for i in range(0, 5):
    for j in range(0, 5):
        print '*',
    print

注意:第二个print的缩进和内层的for是一样的,这表明它是外层for循环中的语句,每次i的循环中,它会执行一次。
print后面没有写任何东西,是起到换行的作用,这样,每输出5个*,就会换行。

要输出第二个三角图案时,我们需要根据当前外层循环的序数,设置内层循环应当执行的次数。
for i in range(0, 5):
    for j in range(0, i+1):
        print '*',
    print

内层的j每次从0到i+1进行循环。
这样,当第一次i=0时,j就是range(0,1),只输出1个*。
而当最后一次i=4时,j就是range(0,5),输出5个*。


最后顺便说下,如果有同学用的是PyScripter,或者其他第三方IDE,可以通过debug中的step,查看程序是怎样一行一行运行的。IDLE在这方面做得不太好,虽然也可以步进调试,但是很麻烦且不直观,所以就不推荐去用了。


作者: z344618505    时间: 2014-11-22 14:03
图片挂了
作者: crossin先生    时间: 2014-11-22 21:36
z344618505 发表于 2014-11-22 14:03
图片挂了

呃,是的呢。
要不先去这里看
http://115.29.188.128/static/wechat/index.html
作者: xiaohuzai    时间: 2015-2-16 16:29
问一下,为什么不能用print“\n”来换行呢?
  1. for i in range(0, 5):
  2.       for j in range(0, 5):
  3.         print '*',
  4.       print '\n'
复制代码
试了下,结果如下
* * * * *

* * * * *

* * * * *

* * * * *

* * * * *
感觉中间空了一行,这是何故?
作者: crossin先生    时间: 2015-2-17 11:29
xiaohuzai 发表于 2015-2-16 16:29
问一下,为什么不能用print“\n”来换行呢?试了下,结果如下
* * * * *

print 本身如果不加逗号的话,会自带换行
所以直接 print 不用 '\n'就行了
作者: xiaohuzai    时间: 2015-2-23 11:46
crossin先生 发表于 2015-2-17 11:29
print 本身如果不加逗号的话,会自带换行
所以直接 print 不用 '\n'就行了

啊,明白啦,谢谢crossin先生~
作者: zzxomg    时间: 2015-3-12 21:19
  1. >>> for i in range(1,6):
  2. ...     for j in range(1,i) :
  3. ...             print '*',
  4. ...     print'\n'
复制代码

作者: cross    时间: 2015-4-21 10:34
print'\n' 比直接print的行间距要大好多啊
作者: lovia    时间: 2015-5-27 19:35
  1. for i in range(0,5):
  2.     print '*' #five lines *
  3. print "Next"

  4. for i in range(0,5):
  5.     print '*', #one line *****
  6. print
  7. print "Next"

  8. for i in range(0,5):
  9.     for j in range(0,i+1):
  10.         print '*',
  11.     print
复制代码

作者: b33e    时间: 2015-11-12 10:41
for i in range(1,6):
    print '*'*i

作者: mengnanlong    时间: 2016-1-11 17:25
n=int(input())
for i in range(1,n+1):
    for j in range(0,n-i):
        print('',end='')
    for j in range(0,i):
        print('*','',end='')

    print()
crossin先生为什么我写了这个代码,没有打出您要求的第7题的样子啊?
作者: crossin先生    时间: 2016-1-12 13:55
mengnanlong 发表于 2016-1-11 17:25
n=int(input())
for i in range(1,n+1):
    for j in range(0,n-i):

那是什么样子?我没有python3,看上去代码没什么问题
作者: mengnanlong    时间: 2016-1-13 15:03
crossin先生 发表于 2016-1-12 13:55
那是什么样子?我没有python3,看上去代码没什么问题

crossin先生,我找到原因了,在描述空格那段应该输出print('','',end=''),少了一个‘’
作者: speedbird    时间: 2016-3-21 07:09
本帖最后由 speedbird 于 2016-3-21 07:13 编辑
  1. Line = int(input("Enter line:"))

  2. for Line_up in range(1,Line+1):
  3.     for lr in range(0,Line_up):
  4.         print("*","",end="")

  5.     print()

  6. for Line_down in range(1, Line):
  7.     for ld in range(Line - Line_down):
  8.         print("*","",end="")

  9.     print()
复制代码
========================= RESTART: C:/MyPython/1.py =========================
Enter line:5
*
* *
* * *
* * * *
* * * * *
* * * *
* * *
* *
*
>>>
作者: 追风    时间: 2016-4-30 16:38
crossin先生 发表于 2015-2-17 11:29
print 本身如果不加逗号的话,会自带换行
所以直接 print 不用 '\n'就行了

恍然大悟
作者: FPOS    时间: 2016-5-18 13:13
本帖最后由 FPOS 于 2016-5-18 13:22 编辑

用*每层递增,想了一个早上都没什么头绪,网上一下子又找不到答案,就回顾了下前面几课。
终于完成
a=0
b=0
for i in range(0,5):
    b=b+1
    for j in range(a,b):
        print '*',
    print

看了第10楼的,本来还挺兴奋。。。


作者: crossin先生    时间: 2016-5-18 16:37
FPOS 发表于 2016-5-18 13:13
用*每层递增,想了一个早上都没什么头绪,网上一下子又找不到答案,就回顾了下前面几课。
终于完成
a=0

没关系,继续优化嘛
作者: FPOS    时间: 2016-5-18 19:10
crossin先生 发表于 2016-5-18 16:37
没关系,继续优化嘛

废话太多了,和昨天while一样。
并没有完全理解,似懂非懂的,所以写出来的总有很多画蛇添足多此一举的内容。
作者: ponber    时间: 2016-12-20 19:52
crossin 老师,有的课有习题,有的课怎么没有呢?习题集里也不好对应是哪一节课
作者: crossin先生    时间: 2016-12-20 22:19
ponber 发表于 2016-12-20 19:52
crossin 老师,有的课有习题,有的课怎么没有呢?习题集里也不好对应是哪一节课 ...

习题不是完全对应的
作者: Imagination    时间: 2017-11-27 00:02
for i in range(0, 5):
    for j in range(0, 5):
        print ('*',end='')
    print
我用py3输入这个 运行出来是一排*  求解
作者: crossin先生    时间: 2017-11-27 01:34
Imagination 发表于 2017-11-27 00:02
for i in range(0, 5):
    for j in range(0, 5):
        print ('*',end='')

第二个print你没有加括号,没有调用
作者: chc584906948    时间: 2017-11-27 17:21
老师,为啥我是
>>> for i in range(0,5):
        for j in range(0,i+1):
                print('*')
        print()

       
*

*
*

*
*
*

*
*
*
*

*
*
*
*
*
怎样让*并排在一行?我加了逗号也不行
作者: crossin先生    时间: 2017-11-28 08:13
chc584906948 发表于 2017-11-27 17:21
老师,为啥我是
>>> for i in range(0,5):
        for j in range(0,i+1):

看你楼上的代码
作者: chc584906948    时间: 2017-11-28 11:32
crossin先生 发表于 2017-11-28 08:13
看你楼上的代码

明白!谢谢老师,这个end是python2和3的区别吗?还有我看您例题里的print后面没有括号的
作者: woodumpling    时间: 2017-11-28 18:38
对,2和3在print上存在一些区别
作者: booiya    时间: 2018-1-4 16:04
for i in range(0,5):
for j in range(0,5):
   print"*",
   print

楼主,我用的是mac下面的PCcharm,输出来的是一列的*,是不是最后的print后面的输出格式不对?
作者: crossin先生    时间: 2018-1-5 18:03
booiya 发表于 2018-1-4 16:04
for i in range(0,5):
for j in range(0,5):
   print"*",

最好截个图,从你这个没看出问题。如果你是python3,请搜下python3怎么不换行输出
作者: xizirui    时间: 2018-2-20 22:03
您好crossin先生,看到公众号感觉非常干货,也有了对python的学习热情,然而电脑下载的是PY3,看的一直是PY2的教程,导致过程中一直遇到一些问题拉扯,只好求助群里大腿,但是不想被这种低级问题耽误大家时间,想问问有没有针对py3的这种教程,感觉循序渐进学习热情又高,非常感谢
作者: crossin先生    时间: 2018-2-21 12:43
xizirui 发表于 2018-2-20 22:03
您好crossin先生,看到公众号感觉非常干货,也有了对python的学习热情,然而电脑下载的是PY3,看的一直是PY ...

http://crossincode.com/course/lesson_list/
课程里关于2和3变动的地方有说明
另外看下这篇,并没有特别大的差异 https://mp.weixin.qq.com/mp/appm ... 764b887679757a51245
作者: starleilei    时间: 2018-3-11 09:17
老师,十楼的代码好简练啊,但是看不懂,能否详细讲解一下
作者: crossin先生    时间: 2018-3-11 15:41
starleilei 发表于 2018-3-11 09:17
老师,十楼的代码好简练啊,但是看不懂,能否详细讲解一下

'*' * 5
你试下字符乘以数字的效果就明白了
作者: starleilei    时间: 2018-3-18 07:35
crossin先生 发表于 2018-3-11 15:41
'*' * 5
你试下字符乘以数字的效果就明白了

感谢,弄明白了
作者: shan    时间: 2018-4-12 10:20
crossin先生 发表于 2015-2-17 11:29
print 本身如果不加逗号的话,会自带换行
所以直接 print 不用 '\n'就行了

如果在python 3上面print 后面一定得加'\n',
如果不用'\n' ,输出的结果会直接一行25个
是吗?
作者: crossin先生    时间: 2018-4-12 11:39
shan 发表于 2018-4-12 10:20
如果在python 3上面print 后面一定得加'\n',
如果不用'\n' ,输出的结果会直接一行25个
是吗? ...

不是
print() 就会换行
作者: shan    时间: 2018-4-12 14:27
crossin先生 发表于 2018-4-12 11:39
不是
print() 就会换行

明白
作者: amengguyi    时间: 2018-10-14 23:00
为什么print 后加逗号雪花不是在同一行呢?我是python3.7
作者: crossin先生    时间: 2018-10-15 22:17
amengguyi 发表于 2018-10-14 23:00
为什么print 后加逗号雪花不是在同一行呢?我是python3.7

print('*', end='')
课程里版本差异的地方有提
作者: amengguyi    时间: 2018-10-18 21:53
crossin先生 发表于 2018-10-15 22:17
print('*', end='')
课程里版本差异的地方有提

谢谢先生




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5