标题:关于for 循环的疑问
只看楼主
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
结帖率:93.75%
 问题点数:0 回复次数:6 
关于for 循环的疑问
程序代码:
import datetime

def date_range(start_date, peroids, days=0, seconds=0, microseconds=0,
               milliseconds=0, minutes=0, hours=0, weeks=0):
############只有两行井号之间的代码才是我写的,其它都是平台的答题模板#####################
    p = 5-peroids
    peroids -= 1
    k =start_date+ datetime.timedelta(days=days*p,
                            seconds=seconds*p,
                            microseconds=microseconds*p,
                            milliseconds=milliseconds*p,
                            minutes=minutes*p,
                            hours=hours*p,
                            weeks=weeks*p
                            )
    
    return k
####################################


start = datetime.datetime.strptime('2019-03-22 12:00:00', '%Y-%m-%d %H:%M:%S')

for d in date_range(start, 5, days=1):     #报错信息出现在这一行,datetime.datetime对象 不可被复用/迭代
    print(d)                               
print('-------------------')
for d in date_range(start, 5, minutes=2):
    print(d)
print('-------------------')
for d in date_range(start, 5, weeks=3, hours=1):
    print(d)

Exited with error status 1
Traceback (most recent call last):
  File "99f387d91c50749fb27fccb205915d2c", line 22, in <module>
    for d in date_range(start, 5, days=1):
TypeError: 'datetime.datetime' object is not iterable

该程序所期望的Output如下:
2019-03-22 12:00:00
2019-03-23 12:00:00
2019-03-24 12:00:00
2019-03-25 12:00:00
2019-03-26 12:00:00
-------------------
2019-03-22 12:00:00
2019-03-22 12:02:00
2019-03-22 12:04:00
2019-03-22 12:06:00
2019-03-22 12:08:00
-------------------
2019-03-22 12:00:00
2019-04-12 13:00:00
2019-05-03 14:00:00
2019-05-24 15:00:00
2019-06-14 16:00:00

我的问题在于,我不了解下面这段代码,运行起来有什么效果
程序代码:
for d in date_range(start, 5, days=1):     
    print(d) 
########################################是不是相当于下面的循环?
for i=0 to 5:
    d=date_range(start,5,days=1)
    print(d)
########################################还是相当于下面的循环?如果是,for循环怎么知道是哪个常量作为迭代变量的?
for i=0 to 5:
    d=date_range(start,i,days=1)
    print(d)






搜索更多相关主题的帖子: 循环 for datetime start print 
2020-03-06 11:45
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
得分:0 

参考Python文档,我现在理解是 那个for语句是  类似于C语言的递归。

    问题是,我该怎么写?   return 要返回我计算得到的结果用于赋值给d,  那是下面这么写吗?这么些能把递归结果传递到main函数吗??
def date_range(start_date, peroids, days=0, seconds=0, microseconds=0,
               milliseconds=0, minutes=0, hours=0, weeks=0):
    if(peroids>0):
        date_range(....)






φ(゜▽゜*)♪
2020-03-06 12:00
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
得分:0 
有时灵光一闪而过,既然timedate.timedate对象不可迭代,那是不是我return 一个字符串类型就行了。
程序代码:
import datetime

def date_range(start_date, peroids, days=0, seconds=0, microseconds=0,
               milliseconds=0, minutes=0, hours=0, weeks=0):
    if(peroids > 0):    //Python是不是不支持这种形式的程序递归啊?因为从输出结果看逻辑   这段代码看起来并没有被执行呢!
        date_range(start_date,peroids-1,days,seconds,microseconds,milliseconds,minutes,hours,weeks)
    p = peroids
    k =start_date+ datetime.timedelta(days=days*p,
                            seconds=seconds*p,
                            microseconds=microseconds*p,
                            milliseconds=milliseconds*p,
                            minutes=minutes*p,
                            hours=hours*p,
                            weeks=weeks*p
                            )
    
    return datetime.datetime.strftime(k,'%Y-%m-%d %H:%M:%S')



start = datetime.datetime.strptime('2019-03-22 12:00:00', '%Y-%m-%d %H:%M:%S')

for d in date_range(start, 5, days=1):
    print(d)
print('-------------------')
for d in date_range(start, 5, minutes=2):
    print(d)
print('-------------------')
for d in date_range(start, 5, weeks=3, hours=1):
    print(d)

这回没有报错了,运行我的程序Output如下:
程序代码:
2
0
1
9
-
0
3
-
2
7

 
1
2
:
0
0
:
0
0
-------------------
2
0
1
9
-
0
3
-
2
2

 
1
2
:
1
0
:
0
0
-------------------
2
0
1
9
-
0
7
-
0
5

 
1
7
:
0
0
:
0
0

搞不懂这个额一个字符一个换行的结果是怎么得来的?return 的应该是字符串啊,这里怎么看着像是逐个字符return的.

难道是,我应该在函数里建立一个 数组/列表   ,用于保存需要return的迭代数据,最后一次性return。
然后main()里面 就变成了  for d in [列表]:print()   









φ(゜▽゜*)♪
2020-03-06 13:27
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
得分:0 
程序代码:
import datetime

def date_range(start_date, peroids, days=0, seconds=0, microseconds=0,
               milliseconds=0, minutes=0, hours=0, weeks=0):
    a={}
    for p in range(1,peroids+1):
        a[p] =start_date+ datetime.timedelta(days=days*p,
                            seconds=seconds*p,
                            microseconds=microseconds*p,
                            milliseconds=milliseconds*p,
                            minutes=minutes*p,
                            hours=hours*p,
                            weeks=weeks*p
                            )
    print(a)    
    return a

start = datetime.datetime.strptime('2019-03-22 12:00:00', '%Y-%m-%d %H:%M:%S')

for d in date_range(start, 5, days=1):
    print(d)
print('-------------------')
for d in date_range(start, 5, minutes=2):
    print(d)
print('-------------------')
for d in date_range(start, 5, weeks=3, hours=1):
    print(d)

我构造了一个列表用于存储运行得到的datetime.datetime对象,遗憾的是,回到main()程序,print(d)却只输出了序号1,2,3,4,5.我不明白这是为什么?
程序代码:
=========== RESTART: D:/OneDrive/python/13365.date_range 生成时间序列.py ===========
{1: datetime.datetime(2019, 3, 23, 12, 0), 2: datetime.datetime(2019, 3, 24, 12, 0), 3: datetime.datetime(2019, 3, 25, 12, 0), 4: datetime.datetime(2019, 3, 26, 12, 0), 5: datetime.datetime(2019, 3, 27, 12, 0)}
1
2
3
4
5
-------------------
{1: datetime.datetime(2019, 3, 22, 12, 2), 2: datetime.datetime(2019, 3, 22, 12, 4), 3: datetime.datetime(2019, 3, 22, 12, 6), 4: datetime.datetime(2019, 3, 22, 12, 8), 5: datetime.datetime(2019, 3, 22, 12, 10)}
1
2
3
4
5
-------------------
{1: datetime.datetime(2019, 4, 12, 13, 0), 2: datetime.datetime(2019, 5, 3, 14, 0), 3: datetime.datetime(2019, 5, 24, 15, 0), 4: datetime.datetime(2019, 6, 14, 16, 0), 5: datetime.datetime(2019, 7, 5, 17, 0)}
1
2
3
4
5
>>> 

φ(゜▽゜*)♪
2020-03-06 13:44
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
得分:0 
以下是最终符合平台所需输出结果的代码
程序代码:
import datetime
import sys

def date_range(start_date, peroids, days=0, seconds=0, microseconds=0,
               milliseconds=0, minutes=0, hours=0, weeks=0):
    a= []
    for p in range(peroids):
        a.append(start_date+ datetime.timedelta(days=days*p,
                            seconds=seconds*p,
                            microseconds=microseconds*p,
                            milliseconds=milliseconds*p,
                            minutes=minutes*p,
                            hours=hours*p,
                            weeks=weeks*p
                            ))
    #print(a)
    
    return a



start = datetime.datetime.strptime('2019-03-22 12:00:00', '%Y-%m-%d %H:%M:%S')

for d in date_range(start, 5, days=1):
    print(d)
print('-------------------')
for d in date_range(start, 5, minutes=2):
    print(d)
print('-------------------')
for d in date_range(start, 5, weeks=3, hours=1):
    print(d)

汇总理解如下
程序代码:
for d in date_range(start, 5, days=1):
    print(d)
print('-------------------')
#########################相当于下面的程序
a=date_range(start,5,days=1)
for i in a:
    print(i)






φ(゜▽゜*)♪
2020-03-06 14:00
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
程序代码:
import datetime

def date_range(start_date, peroids, days=0, seconds=0, microseconds=0,
               milliseconds=0, minutes=0, hours=0, weeks=0):
    a=[]
    for p in range(peroids):
        a.append(start_date+ datetime.timedelta(days=days*p,
                            seconds=seconds*p,
                            microseconds=microseconds*p,
                            milliseconds=milliseconds*p,
                            minutes=minutes*p,
                            hours=hours*p,
                            weeks=weeks*p
                            ))
    
    return a

start = datetime.datetime.strptime('2019-03-22 12:00:00', '%Y-%m-%d %H:%M:%S')

for d in date_range(start, 5, days=1):
    print(d)
print('-------------------')
for d in date_range(start, 5, minutes=2):
    print(d)
print('-------------------')
for d in date_range(start, 5, weeks=3, hours=1):
    print(d)


E:\wp>python datewp.py
2019-03-22 12:00:00
2019-03-23 12:00:00
2019-03-24 12:00:00
2019-03-25 12:00:00
2019-03-26 12:00:00
-------------------
2019-03-22 12:00:00
2019-03-22 12:02:00
2019-03-22 12:04:00
2019-03-22 12:06:00
2019-03-22 12:08:00
-------------------
2019-03-22 12:00:00
2019-04-12 13:00:00
2019-05-03 14:00:00
2019-05-24 15:00:00
2019-06-14 16:00:00

DO IT YOURSELF !
2020-03-08 20:09
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
a[p] =start_date+ datetime.timedelta(days=days*p,
python中没有数组的概念  作为列表  如果已知存在数据  可以用a[p]这样来访问  赋值确是不能用=

DO IT YOURSELF !
2020-03-08 20:17



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-499581-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.141809 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved