失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > lil9341_使用Python评估Lil John的“拒绝接受什么”

lil9341_使用Python评估Lil John的“拒绝接受什么”

时间:2020-04-02 21:24:49

相关推荐

lil9341_使用Python评估Lil John的“拒绝接受什么”

lil9341

拒绝什么?

我最近听了Lil John和DJ Snake永恒的经典作品“ Turn Down for What”。 在这部杰作中,他们提出了一个问题,我开始着手使用Python以编程方式解决该问题。 问题是“拒绝接受什么?”。 在解决这个难题时,我还将讨论如何在Python中利用以下概念:

While循环

3. Do While循环(在Python中模拟)

4.条件语句

5.变量

6. JSON数据

7.数据建模与仿真

在进入代码之前,让我们看一下歌词,看看如何解决这个问题:

Fire up that loud

Another round of shots

Turn down for what?

Turn down for what?

Turn down for what?

Turn down for what?

Turn down for what?

这里第一个明显的问题是,“拒绝为什么?”的含义是什么? 根据:

"Turn up" means to drink, party, dance and possibly do drugs. The opposite (stop partying and sober up) is to "turn down." When Lil Jon says the phrase in the song, he is telling listeners there is no reason to stop partying.

因此,我们要在此处解决的问题如下:是否有理由拒绝? 如果是这样,何时才能满足该条件?

While循环与Do While循环

如果我们分析歌词的第一行,似乎Lil John和DJ Snake告诉我们,当聚会开始时,所有聚会的顾客都将需要进行另一轮射击。 同样,大声将被触发。 本质上,他们正在执行一些操作,然后执行条件语句“拒绝执行什么操作?”。 这是Do While循环的基本流程,在许多基于C的语言中都很常见。 Do While循环的一般语法如下:

基本上,Do While循环与其他常见循环的不同之处在于,它在检查条件之前执行代码。 这意味着要执行的代码将始终至少执行一次。 让我们将其与典型的While循环进行比较:

在此,条件是第一个,然后是要执行的代码。 如果在首次运行代码时满足条件,则将永远不会执行该代码。 让我们再来看一下“拒绝什么”的效果:

Lil John的初始语句似乎是Do While循环,因为要执行的代码位于条件语句之前,在这里已转换为伪代码。 假设条件或拒绝的理由是不超过9:00 pm。 如果此部分代码在晚上9:01运行,那么至少每个人都有一枪,而且每个人都可以短暂地聚会。 但是,在相同的情况下,如果Lil John在要执行的代码之前编写了条件语句:

这样一来,就不会有任何镜头,派对就永远不会开始。 在这种情况下,Lil John聪明地以这种方式编写了代码,因此即使条件评估为True,无论如何,每个人仍然至少要参加一次聚会。

在Python中执行Do While循环

尽管许多基于C的语言都有编写Do While循环的本机方式,但是Python没有。 为了获得相同的结果,我们需要使用与上面的伪代码稍有不同的语法来模拟Python中的Do While循环。

在这里,我们模拟了Python中的Do While循环。while True只会让循环永远持续下去。 如果此后没有任何条件,则循环将无限期运行。 但是,我们在循环中包含了一条条件语句,如果满足该条件,我们将break循环,并使之短路。 最后,代码将始终至少执行一次,然后可能在条件语句中终止。

定义变量

Python是动态类型的,这意味着您不必声明每个变量的类型。 在Python中,变量是文本和数字的存储占位符。 它必须具有一个名称,以便您可以再次找到它。 始终为变量分配等号,后跟变量的值。

布尔值

Boolean values are the two constant objects False and True.

They are used to represent truth values (other values can also be considered

false or true).

In numeric contexts (for example, when used as the argument to an

arithmetic operator), they behave like the integers 0 and 1, respectively.

The built-in function bool() can be used to cast any value to a Boolean,

if the value can be interpreted as a truth value

They are written as False and True, respectively.

号码

Numeric variables in Python are used to store numbers. Numbers are usually stored as integers, floating-point values, or complex numbers, depending on the requirements of the program.

在Lil John的歌词中,他没有明确定义变量,但是隐含了变量。 我们不能确定Loud的起始值是多少,只能确定它会被fired up。 我们还不知道“fired up”多少会incrementsLoud的值,或者它是打开还是关闭的booleanTrueFalse)。

递增数值变量

如果variableLoud是要incrementednumerical,则它可能看起来像这样:

设置布尔变量

但是,如果variableLoudboolean,则可以这样写:

在决定如何处理变量Loud之前,重要的是要了解到底Loud是什么。 根据城市词典:

1. (Adjective) used to describe marijuana of veryhigh quality; very strong weed.

2. (Adjective) used to describe something (or someone) that is of high quality;very good; awesome; sick (slang); cool;dope(slang); amazing.

基于此,Lil John似乎打算在前一种情况下使用Loud。 考虑到这一点,将其视为递增的数值而不是布尔值可能更有意义。 如果我们将其视为布尔值,并将其值设置为False,则表明当前没有大声启动。 相反,如果我们使用该值作为数字,则可以对其进行递增,这表明不断有更多的Loud被触发。

我们还可以假设另一轮射击也是如此。 射门需要是一个数值,该值将存储射门次数。 其格式看起来与我们之前的示例非常相似:

现在,我们对如何通过Python表示这种情况有了一个大概的了解,让我们比较一下到目前为止的内容:

此时,看起来似乎还不错。 我们已经成功地将大多数情况转换为可测试的Python代码块。 但是,仍然存在一些尚待解决的问题。

终止此循环的condition是什么? “拒绝什么”一词似乎表明没有理由拒绝,也许永远不会拒绝。 在编程中,这可能会引起问题,因为如果不满足终止条件,则while循环将无限期地运行。 在该场景中,“ Turn Down for What”或我们的条件语句被重复5次似乎也令人困惑。 通常,条件语句只需要执行一次。 为了使事情更简单,最简单的方法可能是只调用一次此行,而不是不执行任何代码而重复多次条件。

在确定第一个问题的答案时,似乎确实存在至少一个条件可以终止while循环。 在循环的每次迭代中,将要求每位参加聚会的客人进行另一轮射击。 这意味着随着聚会的继续,客人将开始陶醉。 在某种程度上,如果这种模式继续下去,所有来宾都会陶醉于派对,而派对将被要求“拒绝”,从而结束while循环。 考虑到这一点,让我们考虑以下几点:

在美国,一个人的平均体重为180.62磅。 白酒(蒸馏酒)最常在1.5盎司的混合饮料中食用。 精神。 有时将烈酒(伏特加,杜松子酒,苏格兰威士忌,波旁威士忌等)与水,苏打水或果汁混合,或“直接”或“在岩石上”食用。 无论烈酒如何消费,标准量(1.5盎司)的标准酒精度(80酒精度)(按体积计40%的酒精度)的酒精含量与标准啤酒和葡萄酒的含量相同。 所以1.5盎司 x 40%的酒精含量= 0.6盎司。 酒精/服务。

“ BAC”是“血液中的酒精浓度”的缩写,是人们血液中酒精含量的度量。 通常,BAC随着人的饮酒而上升。

血液酒精浓度高于0.14通常意味着一个人会感到不那么欣喜,并且可能更不愉快。 0.25,大多数人将受到严重损害。

对于美国平均体重(180.62磅)的人,达到血液酒精浓度0.14所需的枪击次数可能约为8-10杯饮料(每次1.5盎司)。 参见图1a。

图1a

因此,我们可以假设,如果在while循环的每次迭代中Shotsincremented了,那么到第9次迭代时,聚会将开始必然“拒绝”。 将其合并到我们的代码中的最佳方法可能是设置一个名为Party的变量,其初始值为10,并且随着我们增加酒水量,我们将partyvariable。 然后,如果partyvariable曾经达到0,则将满足condition,并且该party将拒绝。 但是,这给我们带来了一个问题。 考虑一下我们绘制方变量的图形。 参见图1b。

图1b

基本上,聚会开始时会很有趣,然后减少等于所消耗镜头数量的值。 我不认为这是Lil John在描述这种情况时所设想的聚会类型。 这给我们带来了一个难题。 里尔·约翰(Lil John)似乎想像一个聚会,无限期地增加“大声”,“射击”和“娱乐”,但是,如果所饮用的饮料数量也无限期地增加,那么可以享受的娱乐量也将受到有限的限制。

此外,通过以这种方式考虑问题,我们没有考虑其他变量。 例如,我们假设这是一个封闭方。 换句话说,如果在此事件中有20位来宾,则while循环开始并递增,直到聚会结束,所有20位来宾的血液酒精浓度均达到或大于.25。 我们假设没有新客人来参加聚会。 实际上,新来宾可能会比其他人迟到,这意味着并非整个团队不会同时达到相同的血液酒精浓度。

我们可能要考虑的另一个因素是,当聚会增加并变得更大声时,它可能会吸引更多潜在的客人参加聚会。

让我们看看如何以可视方式表示这些数据。 参见图1c。

图1c

在此粗略示例中,Lil John的聚会开始时有7个人(或我们的while循环开始)。 相反,有22个人目前不在聚会中,但距离聚会很近。 在while循环的每次迭代中,大声和镜头的值都会增加,并且,这样做的副作用是,更多当前不在场的人更可能意识到聚会。 那些参加聚会的人将进入我们的while循环,在那里他们将被迫在每次迭代中享受另一轮射击。 让我们看一下如何在我们的代码中进行显示的另一种可视化。 参见图1d。

图1d

这有助于我们了解宴会上的噪音水平,宴会上的客人人数和宴会上的醉酒客人人数之间的关系。 在聚会开始时,噪音可能不会从0开始,而可能在50左右。在聚会开始时,聚会上的所有客人都不会醉心。 当客人开始陶醉时,与此同时,还没有陶醉的新客人加入了聚会。 但是我们可以看到,最终每个数据点都将达到平稳状态。 以这种方式考虑数据,我们可以在进行下一步之前做出3个安全的假设:

噪音水平最大(立体声只能调高至100%)。 此外,在所有来宾都参加聚会之前,以及在第一个来宾完全醉酒之前,噪音水平很可能达到最大值(这主要是因为噪音水平很可能会从高水平开始,并会比迟早达到最大值。 可能达到平稳状态的第二个数据点是聚会上的客人人数。 该数据点可以基于最大人口和/或人口密度。 这并不一定意味着所有民众都将参加聚会。 相反,最终将有一定数量的人口参加。 要达到最大值的最后一个数据点是宴会上醉酒的宾客人数。 一旦最大数量的聚会顾客到达聚会,并且所有客人都完全醉酒,聚会就可能结束了(拒绝返回True的条件)。

JSON数据

由于根据聚会顾客的性别,我们计算BAC的方式存在差异,并且由于每个聚会顾客的体重会有所不同,因此最好单独对待每个客人的烦恼。 一个很好的方法是使用JSON数据。 JSON表示JavaScript对象表示法,并且是存储数据的常用方法。 标准JSON对象由键/值对组成。 让我们看看如何使用JSON数据来跟踪访客。 每个guest JSON对象可能如下所示:

图2a

在我们之前的图表中,我们看到了一个潜在的场景,最初有7位客人参加Lil John的聚会,而22位尚未出席。 如果我们使用如图2a所示的JSON数据来表示它,那么每个来宾将具有一个数据配置文件。 这些密钥将为我们提供有关每个访客的有意义的数据。 按键“性别”,“ genderConstant”,“体重”和“消耗的镜头”都将帮助我们计算每个客人当前的血液酒精含量。 “ atParty”键可以让我们知道在每次迭代过程中,客人当前是否参与了“射击”。

在循环的每次迭代中,如果访客的“ atParty”值设置为True,并且当前访客的血液酒精含量也低于.2,则该访客的“消耗的镜头”值将增加一个值1的值,则相同宾客的“ bac”键将使用新的“消耗的镜头”值重新计算。

如果在任何时候客人的血液酒精含量高于0.2,我们可以认为客人过于醉酒无法继续喝酒。 一旦所有将要参加聚会的来宾都到达聚会并且每个来宾的血液酒精含量也为0.2,则条件将返回True,并且while循环将终止。 为此,我们可能要使用以下代码结构:

图2b

在上面的示例中,此练习的基本框架是首先定义变量。 以上是这些变量中每个变量的一些可能的起始值。 我们创建新客人的功能将需要确定新客人是男性还是女性。 为了确定这一点,我们将随机选择一个MaleFemale数组。 一旦创建了新访客,我们就可以将该新访客附加到我们的arrayOfGuests中。 我们的另一个功能,即计算BAC,将使用每个当前客人的值并计算他们当前的血液酒精含量。 最后,我们的“现有访客的编辑值”将添加每个访客消耗的总镜头数量,然后调用calculate BAC函数重新计算访客的BAC。

让我们分别看一下这些功能,看看它们如何工作:

计算BAC:

def calculateBAC(shotsConsumed, weight, genderConstant):

newBAC = shotsConsumed/(weight*genderConstant)*50

return newBAC

此函数将使用三个参数:

消耗的镜头 重量 性别常数。

该函数将计算新的血液酒精含量,并返回该值。

创建一个新人:

def createNewPerson():

genderConstant = 0

choice = random.choice(maleFemale)

sConsumed = 0

weight = random.randint(115, 260)

if choice == 'male':

genderConstant = 0.68

elif choice == 'female':

genderConstant = 0.55

person = {

'gender': choice,

'genderConstant': genderConstant,

'weight': weight,

'shotsConsumed': sConsumed,

'bac': 0,

'atParty': bool(random.getrandbits(1))

}

return person

在这里,创建新人将不需要任何参数。 它将随机产生一个新人。 我们的maleFemale变量可能看起来像这样:

maleFemale = ['male', 'female']

该函数从随机选择此数组的值之一开始。 根据选择的值,它将确定.68或.55的genderConstant。 然后,它将在115到260的范围内选择权重。由于在美国,平均人的体重约为180,因此这些值代表每个方的可能的权重范围更广。 最后,该函数将构建一个dict,它基本上是一个JSON对象。 该JSON对象将由我们前面讨论的相同键/值对组成。 然后,该函数将仅返回其生成的JSON对象。

编辑现有人员:

def editExisting(x):

isAtPartyNow = bool(random.getrandbits(1))

if x['atParty'] == True:

newShots = x['shotsConsumed']+1

x['shotsConsumed'] = newShots

x['bac'] = calculateBAC(newShots, x['weight'], x['genderConstant'])

if isAtPartyNow == True:

x['atParty'] = True

if loud > 50 and isAtPartyNow == False:

isAtPartyNow = bool(random.getrandbits(1))

if isAtPartyNow == True:

x['atParty'] = True

if loud > 60 and isAtPartyNow == False:

isAtPartyNow = bool(random.getrandbits(1))

if isAtPartyNow == True:

x['atParty'] = True

if loud > 70 and isAtPartyNow == False:

isAtPartyNow = bool(random.getrandbits(1))

if isAtPartyNow == True:

x['atParty'] = True

if loud > 80 and isAtPartyNow == False:

isAtPartyNow = bool(random.getrandbits(1))

if isAtPartyNow == True:

x['atParty'] = True

if loud > 90 and isAtPartyNow == False:

isAtPartyNow = bool(random.getrandbits(1))

if isAtPartyNow == True:

x['atParty'] = True

return x

此函数将仅接受一个参数(现有人员)。 然后,它将使用人员的键(JSON格式)访问与这些键关联的值。 我们在这里也有条件声明,因为我们将根据客人当前是否参加聚会而对客人进行不同的编辑。

如果客人已经在聚会上(atParty == True),我们将当前人的镜头消耗量增加1,然后将重新计算当前人的血液酒精含量。

如果客人当前不参加聚会,我们将做更多工作。 我们将从随机获得另一个布尔值开始,如果它是True,则将来宾的atParty值重置为True。 但是,如果guest的atParty值仍然为false,则每次声音增加时,我们将再次运行该代码(获取新的布尔值)。 这与我们的图表1c非常吻合,该图表表明,随着噪音水平的提高,客人更有可能参与聚会。

创建所有访客:

for i in xrange(0, 20):

person = createNewPerson()

people.append(person)

此函数将是一个简单的for循环。 在for循环中,我们将迭代一个范围。 此范围代表我们打算接待的客人总数。 在此示例中,我们的测试用例中总共只有20个人。 每个人都将由我们前面看过的函数创建,然后附加到我们的人数组中。

模拟聚会的功能:

while True:

if loud < 90:

loud = loud + 10

for p in people:

if p['bac'] < .2 and p['atParty'] = True:

editExisting(p)

roundsOfShots = roundsOfShots + 1

if roundsOfShots >= 10:

break

这是我们之前看过的基本轮廓,并进行了一些修改。 此处的更改是:

仅当当前值小于90时,Loud的值才会增加。此外,我们不会在每次迭代时将Loud的值增加10,而不是增加1。 我们包含了一个嵌套在while循环中的for循环。 每当while循环运行时,它就会循环聚会上的所有人员。 如果嵌套循环中的当前人员低于.2,并且当前人员也正在聚会上,则我们运行前面看过的editExisting函数,它将增加拍摄数量并重新计算血液酒精含量。 最后,我们还将增加roundsOfShots变量。 在这种情况下,当roundsOfShots变量达到10时,我们使while循环短路。显然,这不是我们最终想要的结果,但是通过这种方式,我们至少可以测试代码以确保其部分工作,然后稍后调整短路条件语句。

让我们看一下所有代码的外观。 我还对起始变量进行了一些调整,并调整了条件语句以缩短while循环:

import random

loud = 50

roundsOfShots = 0

totalPeople = 300

peopleAtParty = 0

peopleNotAtParty = 0

peopleInebriated = 0

timeElapsed = 0

people = []

maleFemale = ['male', 'female']

def calculateBAC(shotsConsumed, weight, genderConstant):

newBAC = shotsConsumed/(weight*genderConstant)

return newBAC

def createNewPerson():

genderConstant = 0

choice = random.choice(maleFemale)

sConsumed = 0

weight = random.randint(115, 260)

if choice == 'male':

genderConstant = 0.68

elif choice == 'female':

genderConstant = 0.55

person = {

'gender': choice,

'genderConstant': genderConstant,

'weight': weight,

'shotsConsumed': sConsumed,

'bac': 0,

'atParty': bool(random.getrandbits(1))

}

return person

def editExisting(x):

isAtPartyNow = bool(random.getrandbits(1))

if x['atParty'] == True:

newShots = x['shotsConsumed']+1

x['shotsConsumed'] = newShots

x['bac'] = calculateBAC(newShots, x['weight'], x['genderConstant'])

if x['atParty'] == False:

if isAtPartyNow == True:

x['atParty'] = True

if loud > 50 and isAtPartyNow == False:

isAtPartyNow = bool(random.getrandbits(1))

if isAtPartyNow == True:

x['atParty'] = True

elif loud > 60 and isAtPartyNow == False:

isAtPartyNow = bool(random.getrandbits(1))

if isAtPartyNow == True:

x['atParty'] = True

elif loud > 70 and isAtPartyNow == False:

isAtPartyNow = bool(random.getrandbits(1))

if isAtPartyNow == True:

x['atParty'] = True

elif loud > 80 and isAtPartyNow == False:

isAtPartyNow = bool(random.getrandbits(1))

if isAtPartyNow == True:

x['atParty'] = True

elif loud > 90 and isAtPartyNow == False:

isAtPartyNow = bool(random.getrandbits(1))

if isAtPartyNow == True:

x['atParty'] = True

return x

for i in xrange(0, totalPeople):

person = createNewPerson()

people.append(person)

while True:

timeElapsed += 10

if loud <= 100:

loud = loud + 10

for p in people:

if p['bac'] < .2 and p['atParty'] == True:

editExisting(p)

if p['bac'] >= .2 and p['atParty'] == True and peopleInebriated < totalPeople:

peopleInebriated += 1

if p['atParty'] == False:

editExisting(p)

roundsOfShots = roundsOfShots + 1

print peopleInebriated

if peopleInebriated >= totalPeople:

break

for p in people:

if p['atParty'] == False:

peopleNotAtParty += 1

else:

peopleAtParty += 1

print p

totalConsumed = 1.5 * (peopleInebriated*roundsOfShots)

print "Total Consumed: ", totalConsumed

print "Time Elapsed is: ", timeElapsed, " minutes"

print "Total People: ", totalPeople

print "People Inebriated: ", peopleInebriated

print "People at the party: ", peopleAtParty

print "People Not at the party: ", peopleNotAtParty

print ("loud is: ", loud)

print ("total rounds of shots: ", roundsOfShots)

在这里,聚会主顾的总数被设置为更实际的300个。BAC计算也进行了修改,使人们可以更长时间地参加聚会。 此外,还添加了一个针对timeElapased的变量,理论上说大声将被触发,大约每10分钟就会增加一轮射击。 通过这些计算,该聚会将持续约3小时20分钟。 在这一点上,所有可能在大声范围之内的聚会嘉宾也都太热情了,无法继续聚会。 结果,满足了拒绝的条件,该党将结束。 在这里还要注意的有趣的是totalConsumed变量,该变量可跟踪消耗的酒精总量。 因为这是基于我们之前得出的1.5盎司的数字得出的,所以总消耗量通常约为9000盎司(约72加仑)。

总之,拒绝什么?

答案似乎是在聚会顾客消耗掉了72加仑酒精之后,如果聚会顾客的总数约为300。

希望这是一个有趣而有趣的练习。 随时分享任何反馈。 谢谢!

翻译自: /using-python-to-evaluate-lil-johns-turn-down-for-what-4a2b6fbe3aa7

lil9341

如果觉得《lil9341_使用Python评估Lil John的“拒绝接受什么”》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。