首页 新闻 会员 周边 捐助

一个关于python的函数式编程的问题,哪位可以帮忙解答下~~~谢谢

0
悬赏园豆:30 [已解决问题] 解决于 2020-10-09 14:50

有两段python代码,运行应该说会一致的,但是没有达到一致的效果,不知道问题在哪,其中car1.py输出是对的.

car1.py:

from random import random

time = 5
car_positions = [1,1,1]

while time:
    # decrease time
    time -= 1

    print ('')
    for i in range(len(car_positions)):
        # move car
        if random() > 0.3:
            car_positions[i] += 1


        # draw car
        print ('-' * car_positions[i])

用函数式的写法:
car_function.py: (执行的输出不太对)

from random import random

def race(state):
    draw(state)
    if state['time']:
        race(run_step_of_race(state))

def draw(state):
    print ('')
    print ('\n'.join(map(output_car,state['car_positions'])))

def output_car(car_positions):
    return '-' * car_positions

def run_step_of_race(state):
    return {'time':state['time']-1,'car_positions':move_cars(state['car_positions'])}

def move_cars(car_positions):
    return map(lambda x : x+1 if random() > 0.3 else x,car_positions)

    

race({'time':5,'car_positions':[1,1,1]})

为什么呢???

ukyo--夜王的主页 ukyo--夜王 | 初学一级 | 园豆:38
提问于:2020-10-09 09:12

建议在博问重新提交一下问题

dudu 4年前

@dudu: 不提倡挂外链接吗

君君的BigHeadDaddy 4年前

@dudu: 悬赏的豆豆该怎样给回答人呢...点不了选项

君君的BigHeadDaddy 4年前

@君君的BigHeadDaddy: 结帖时输入园豆数量

dudu 4年前
< >
分享
最佳答案
1

def move_cars(car_positions):
return map(lambda x : x+1 if random() > 0.3 else x,car_positions)
改为:
def move_cars(car_positions):
return list(map(lambda x : x+1 if random() > 0.3 else x,car_positions))

Python2中,map直接返回元素列表
Python3中,map函数返回一个map类型对象。

收获园豆:15
邀月 | 高人七级 |园豆:25475 | 2020-10-09 11:13

也就是python2和python3版本的问题,

ukyo--夜王 | 园豆:38 (初学一级) | 2020-10-09 11:57
其他回答(1)
0
from random import random


def race(state):
    draw(state)
    if state['time']:      
        race(run_step_of_race(state))


def draw(state):
    print('')
    print('\n'.join(map(output_car, state['car_positions'])))


def output_car(car_positions):
    return '-' * car_positions


def run_step_of_race(state):
    return {'time': state['time'] - 1, 'car_positions': move_cars(state['car_positions'])}


def move_cars(car_positions):
    return list(map(lambda x: x + 1 if random() > 0.3 else x, car_positions)) #这个地方应该返回list,而不是map


race({'time': 5, 'car_positions': [1, 1, 1]})
收获园豆:15
E行者 | 园豆:1811 (小虾三级) | 2020-10-09 11:55

放在python2是没事的对吧

支持(0) 反对(0) ukyo--夜王 | 园豆:38 (初学一级) | 2020-10-09 11:57

@君君的BigHeadDaddy: python2返回的是列表 https://www.runoob.com/python/python-func-map.html
因为你要用到list,所以使用list将map转换成list就行了,你用在线编辑器试试,http://www.pythontip.com/coding/run

支持(1) 反对(0) E行者 | 园豆:1811 (小虾三级) | 2020-10-09 12:06

@E行者: 可以可以,

支持(0) 反对(0) ukyo--夜王 | 园豆:38 (初学一级) | 2020-10-09 12:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册