pythonwhile not_Python Learning-while循环

不出所料,小红的食物摊经营得越来越好,来她这里购买食物的顾客也越来越多,她简直有点应对不睱,她需要我们为她制作一个可以帮助她与顾客沟通的应用——用户可以在应用软件界面输入他们想要的食物名称,如果食物摊的食物清单里有该食物,就通知小红为将食物提供给顾客,如果食物摊的食物清单里没有该食物名称,则提示顾客这里没有他想要的食品。当然,为小红开发这样一个程序,她会付给你一笔费用的!

input()函数

input()函数可以让程序暂停运行,等待用户的输入;当用户输入完毕,并按下回车键时,input()函数将用户的输入返回,这样就可以得到顾客想要的食物名称了

food_name = input("Please tell me what kind of food you want:")

print(food_name)

首先,第一行代码会输出input()参数中的请输入您想要的食物名称:作为提示,如下Please tell me what kind of food you want:

当用户有输入,并按下回车后,input()函数将把获得的输入信息返回,并赋值给food_name变量,然后程序接着向下执行,如下Please tell me what kind of food you want:apple

apple

用户输入了apple,并且按下了回车,程序将用户想要的食物名称打印出来

目前只是简单的获取到了顾客想要的食物,还需要去小红的食品清单里查找是否有相应的食物

# 假设这是目前小红手头的食物清单

foods = [

{'tomato': 3, 'potato': 2, 'onion': 4},

{'apple': 5, 'banana':3.3},

{'beef': 23, 'pork': 14, 'chicken': 19.8, 'fish': 9.7}

]

# 获取用户输入的食物名称

food_name = input("Please tell me what kind of food you want:")

find_food = ""

# 从小红的食物清单里查看是否有顾客想要的食物

for food_list in foods:

if food_name in food_list.keys():

find_food = food_name

print("We have "+find_food+". Please wait a moment")

break

# 如果找到顾客想要的食物,将其赋值给变量find_food

# 如果该变量是空字符串,证明没有找到顾客想要的食物

if find_food == "":

print("Sorry, there are no "+food_name+" here")

现在,运行程序,输入applePlease tell me what kind of food you want:apple

We have apple. Please wait a moment

程序告诉顾客,这里有苹果,请稍等

然后重新运行程序,再输入清单里没有的一种食物,如orangePlease tell me what kind of food you want:orange

Sorry, there are no orange here

程序告诉顾客,这里没有橙子

注,你可能注意到了break这个关键字,别担心,下面会详细讲解

现在,程序每次都需要重新启动,才可以再次接受顾客的输入,这实在是太笨了,如何解决?

while循环

for循环是针对于集合的一种循环,当把集合中的所有元素都遍历一遍后,for循环就会停止。而wilie循环可以无限制的循环下去,直到将指定条件改变不满足为止

while True:

do somithings

while循环通过判断条件是否为True,如果是,则一直执行,如果是False则停止循环

例:输出0~10数字

number = 0

while number <= 10:

print('\n', number)

number += 1

输出:0

1

2

3

4

5

6

7

8

9

10

设置变量number的起始值为0,然后判断它是否小于等于10,如果成立,则将其输出,并在最后通过运行符+=将number的值累加一,+=效果等同于number = number + 1

break关键字让程序停止

上面的例子,是当number等于10的时候,因为执行了number += 1后,number的值已经变成了11,此时number <= 10将返回False,因此,while循环不再执行下面的代码块

number = 0

while True:

print('\n', number)

number += 1

如果现在将条件直接改为True,那么while循环每次执行判断它都是成立的,将永远执行下去,这便成了一个死循环,不仅会消耗计算机性能,还可能导致死机,这种情况一定要避免

number = 0

while True:

print('\n', number)

number += 1

if number > 10:

break

break关键字可以令循环停止,对for循环两样有效;在这里,判断如果number已经大于10,则停止循环

continue关键字

break关键字会令循环停止,而continue会让当前执行返回到循环开头,如打印0~10偶数的例子:

number = 0

while number <= 10:

if number % 2 == 0:

print("\n", number)

number += 1

输出:0

2

4

6

8

10

number % 2中的%是求模运算符,即求两个数相除的余数,如果余数是0,即表示可以整除,如果余数不为0,即表示不能整除,这里通过判断number与2是否以有整除来判断它是不是一个偶数

也可以通过设置一个标志来让循环退出

# 退出标志

exit = False

number = 0

while not exit:

if number % 2 == 0:

print("\n", number)

number += 1

if number > 10:

exit = True

首先设置exit变量值为False,not exit中not表示取反的意思,not Fasle就是Ture,not Ture就是False,如果number大于10,则将exit值尽管为Ture,while循环判断not exit此时为False,因此会退出循环

所谓标志,就是自定义的一个变量,这里专门用来判断循环是否退出,此种情况适合有多种退出条件的情况

最终结果,程序可以一直监听顾客的输入,并且,当小红下班后,只要输入'quit',程序就会停止

# 退出标志

exit = False

# 假设这是目前小红手头的食物清单

foods = [

{'tomato': 3, 'potato': 2, 'onion': 4},

{'apple': 5, 'banana':3.3},

{'beef': 23, 'pork': 14, 'chicken': 19.8, 'fish': 9.7}

]

while not exit:

find_food = ""

# 获取用户输入的食物名称

txt_value = input("Please tell me what kind of food you want:")

if txt_value == 'quit':

exit = True

# 从小红的食物清单里查看是否有顾客想要的食物

for food_list in foods:

if txt_value in food_list.keys():

find_food = txt_value

print("We have "+find_food+". Please wait a moment")

break

# 如果找到顾客想要的食物,将其赋值给变量find_food

# 如果该变量是空字符串,证明没有找到顾客想要的食物

if find_food == "":

print("Sorry, there are no "+txt_value+" here")

程序运行状态:Please tell me what kind of food you want:apple

We have apple. Please wait a moment

Please tell me what kind of food you want:

程序运行一轮后,仍旧会输出Please tell me what kind of food you want:等待用户的输入

小红兴奋的说她有了这个程序,走上人生巅峰不再是问题!

wile循环与列表、字典的结合

for循环在处理列表与字典等集合时,是无法对集合的内容进行修改的。比如在遍历一个拥有10个元素的列表时,如果在for循环体内删除掉该列表的中的一元素,则该列表的长度将减小一,而for循环本来是要循环10次的,结果到了第10次的时候发现没有,相应的位置上没有任何元素,于是会报错

wile循环在此情况下可以很好工作

例一:

# 食物清单

foods = ['tomato', 'potato', 'onion','apple', 'banana']

# 将foods中的食物名称转移到一个空列表中去,并且删除原有内容

new_foods = []

while foods:

food_name = foods.pop()

new_foods.append(food_name)

# 打印新的食物列表

print(new_foods)

# 打印旧的食物列表

print(foods)

输出:['banana', 'apple', 'onion', 'potato', 'tomato']

[]

注:python在判断真假值时,如果判断的值是集合类型的,只要集合不为空则返回Ture,如果是空的则返回False,如果判断的是字符串,如果字符串不是空字符串,则返回Ture,如果字符串是空的则返回False

例二:

# 食物清单中有多个'potato'

foods = ['tomato', 'potato', 'onion','apple','potato', 'banana','potato']

# 删除'potato'

while 'potato' in foods:

foods.remove('potato')

# 打印食物列表

print(foods)

输出:['tomato', 'onion', 'apple', 'banana']

'potato' in foods判断'potato'元素是否包含在列表foods中,如果包含则返回True

remove('potato')每次只会删除匹配到的第一个元素,也就是一次只能删除一个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ```python import numpy as np # Q-table q_table = np.zeros([state_space, action_space]) # Hyperparameters alpha = 0.8 gamma = 0.95 epsilon = 0.1 # Training for episode in range(1, 100001): # Initialize state state = initial_state done = False while not done: # Choose action if np.random.uniform(0, 1) < epsilon: action = np.random.choice(action_space) else: action = np.argmax(q_table[state, :]) # Take action next_state, reward, done, _ = env.step(action) # Update Q-table q_table[state, action] = (1 - alpha) * q_table[state, action] + \ alpha * (reward + gamma * np.max(q_table[next_state, :])) # Update state state = next_state ``` 这是一个简单的 Q-learning 算法的 Python 代码示例。它使用了 numpy 库来创建 Q-table,并使用了超参数 alpha,gamma 和 epsilon 来训练 Q-table。在循环中,它选择一个动作并采取行动,然后更新 Q-table 并更新状态。 ### 回答2: Q-learning是一种基于强化学习的算法,可以用来训练智能体在特定环境下做出最优的决策。Q-learning算法是从Bellman方程中演化出来的,对于每个状态和动作对(S,A),Q-learning算法能够根据环境反馈信息不断地更新状态的Q值,从而使得智能体能够越来越理解环境,最终达到最优决策的目的。 Python是一种流行的编程语言,特别适合处理机器学习以及深度学习的问题。在Python中实现Q-learning算法非常简单,而且可以使用很多库来使得代码更加简洁高效。 下面是一个简单的Python代码实现Q-learning的基本过程: # 1. 初始化: import numpy as np Q = np.zeros([state_size, action_size]) # 2. 设置训练超参数: episodes = 5000 steps = 100 learning_rate = 0.8 discount_factor = 0.9 epsilon = 0.3 for episode in range(episodes): # 3. 重置环境: state = env.reset() for step in range(steps): # 4. 进行决策: if np.random.uniform(0, 1) < epsilon: action = env.action_space.sample() else: action = np.argmax(Q[state, :]) # 5. 执行动作并观察环境反馈数据: new_state, reward, done, _ = env.step(action) # 6. 计算新的Q值: Q[state, action] = (1- learning_rate) * Q[state, action] + learning_rate * (reward + discount_factor * np.max(Q[new_state, :])) # 7. 更新状态: state = new_state # 8. 如果完成当前的任务,则停止当前的训练: if done: break # 9. 测试最优策略: state = env.reset() while True: action = np.argmax(Q[state, :]) new_state, reward, done, _ = env.step(action) state = new_state if done: break print('最优策略:', Q) 以上代码解释: 1.初始化 我们首先导入NumPy库,并设置初始奖励矩阵Q的零矩阵。Q矩阵的大小由状态空间和行动空间确定。 2. 设置训练超参数:我们设定训练周期episode并且每个周期包含多个步骤(steps)。learning_rate是学习速率,该值决定了Q矩阵的更新幅度。discount_factor是折扣因子,该因子决定了Q学习关注的未来收益的大小,0.9是一个常见的值。epsilon是随机选择动作的概率。 3.重置环境:环境状态变量被设定为一个初始状态。 4.进行决策:如果随机数小于epsilon,则随机选择动作。否则,选择在状态state下具有最大Q值的动作。 5.执行动作:智能体执行选择的动作,并根据环境反馈数据调整reward。 6.计算新的Q值:我们使用Bellman方程更新Q值矩阵。 7.更新状态:当前状态设定为新状态。 8.完成当前的任务:如果任务完成,则停止训练。 9.测试最优策略:测试最优策略就是在训练结束后,重新设定环境的状态,并按Q矩阵的输出来选择动作,直到任务结束。最后输出最优策略。 总结: Q学习是一种强大的学习算法,它可以让智能体从环境中学习并做出最优决策。Python代码实现Q学习算法非常简单,只需要导入NumPy库,并设置训练超参数、环境和Q矩阵。代码中实现了基本的Q-learning算法流程,训练结束后可以输出最优策略。 ### 回答3: Q-learning是一种强化学习算法,可以用于解决许多控制问题。Python是一种非常适合实现Q-learning算法的编程语言。在这里,我将介绍如何使用Python实现一个简单的Q-learning算法。 步骤1:定义环境 首先,我们需要定义问题的环境。环境可以是任何具有状态和动作的系统,例如迷宫、机器人等。在这个例子中,我们将使用一个简单的网格世界环境。该环境由一个网格矩阵表示,每个位置可以是空闲、墙壁或目标。机器人可以在网格中上、下、左、右移动,并且在移动到目标时会获得正的奖励,而在撞到墙壁时会获得负的奖励。我们将使用一个Python字典来表示环境,其中键是位置的坐标,值是该位置的状态。 代码示例如下: ``` env = {(0, 0): 's', (0, 1): 'f', (0, 2): 'f', (0, 3): 'g', (1, 0): 'f', (1, 1): 'w', (1, 2): 'f', (1, 3): 'w', (2, 0): 'f', (2, 1): 'w', (2, 2): 'f', (2, 3): 'w', (3, 0): 'f', (3, 1): 'w', (3, 2): 'f', (3, 3): 'w'} ``` 其中,'s'表示起始位置;'f'表示空闲位置;'w'表示墙壁;'g'表示目标。 步骤2:定义Q表 为了执行Q-learning算法,我们需要建立一个Q表,用于存储状态和动作之间的Q值。Q表是一个Python字典,其中键是状态和动作的元组,值是其对应的Q值。在训练期间,我们将更新Q表的值以改进策略。 Q表的初始值通常是随机的,但在这个例子中,我们将Q表的初始值设置为0。 代码示例如下: ``` q_table = {} for state in env: for action in ['up', 'down', 'left', 'right']: q_table[(state, action)] = 0 ``` 步骤3:定义动作选择策略 在Q-learning算法中,我们需要使用一种策略来选择动作。这是一个很重要的决定,因为它会影响到我们训练Q表的速度和最终表现。我们通常会使用ε-贪心策略,其中ε是探索率。在ε-贪心策略中,我们有一个概率ε去随机选择一个动作,而以1-ε的概率选择当前Q值最高的动作。 代码示例如下: ``` def get_action(state, epsilon): if random.uniform(0, 1) < epsilon: return random.choice(['up', 'down', 'left', 'right']) else: q_values = [q_table[(state, a)] for a in ['up', 'down', 'left', 'right']] max_q = max(q_values) count = q_values.count(max_q) if count > 1: best_actions = [i for i in range(len(['up', 'down', 'left', 'right'])) if q_values[i] == max_q] i = random.choice(best_actions) else: i = q_values.index(max_q) return ['up', 'down', 'left', 'right'][i] ``` 在上面的代码中,我们使用了Python的random库来生成随机数,使用了Python的max函数来找到最大Q值,使用了Python的count函数来计算最大Q值数目。 步骤4:执行训练循环 现在,我们已经准备好了一切来开始训练我们的Q表。我们将使用一个简单的训练循环,该循环将执行一定数量的训练周期。在每个周期中,机器人将遍历整个网格世界环境,不断选择状态并执行动作,然后使用Q-learning更新Q表。 代码示例如下: ``` epsilon = 0.9 alpha = 0.1 gamma = 0.9 for i in range(1, 1001): state = (0, 0) while state != (0, 3): action = get_action(state, epsilon) next_state = get_next_state(state, action) reward = get_reward(next_state) q_values = [q_table[(next_state, a)] for a in ['up', 'down', 'left', 'right']] max_q = max(q_values) q_table[(state, action)] += alpha * (reward + gamma * max_q - q_table[(state, action)]) state = next_state ``` 在上面的代码中,我们使用了Python的range函数,Pythonwhile循环和if语句,以及get_next_state和get_reward函数,这些函数用于计算下一个状态和奖励。我们还使用了Python的max函数和q_values.index函数来找到最大Q值。 步骤5:执行测试循环 在训练Q表后,我们可以使用该表来测试机器人在环境中的表现。在测试循环中,我们将遍历整个网格世界环境,机器人将选择具有最高Q值的动作,并完成迷宫寻宝任务。 代码示例如下: ``` state = (0, 0) while state != (0, 3): q_values = [q_table[(state, a)] for a in ['up', 'down', 'left', 'right']] i = q_values.index(max(q_values)) action = ['up', 'down', 'left', 'right'][i] next_state = get_next_state(state, action) state = next_state ``` 这就是一个简单的Q-learning算法的Python实现。这只是可能性之一,因为实现Q学习还有许多不同的方法和技术。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值