我刚刚学习了Python中的递归并完成了分配,其中一个是计算任意嵌套列表列表中的所有元素.我搜索过这个网站,发现答案似乎都使用了递归调用.由于已经教导过任何可以递归表达的东西都可以迭代表达,迭代在Python中是首选,如果没有Python 2.6中的递归或导入模块(作为学习练习),如何实现呢?(嵌套列表本身将被视为元素,其内容也将被计为.)例如:
>>> def element_count(p):
... count = 0
... for entry in p:
... count += 1
... if isinstance(entry, list):
... count += element_count(entry)
... return count
>>> print element_count([1, [], 3])
3
>>> print element_count([1, [1, 2, [3, 4]]])
7
>>> print element_count([[[[[[[[1, 2, 3]]]]]]]])
10
Run Code Online (Sandbox Code Playgroud)
如何使用迭代编写?
对于赋值,我们被要求创建一个返回反函数的函数.基本问题是从平方函数创建平方根函数.我想出了一个使用二进制搜索的解决方案和另一个使用牛顿方法的解决方案.我的解决方案似乎适用于cube-root和square-root但不适用于log10.这是我的解决方案:
#Binary Search
def inverse1(f, delta=1e-8):
"""Given a function y = f(x) that is a monotonically increasing function on
non-negative numbers, return the function x = f_1(y) that is an approximate
inverse, picking the closest value to the inverse, within delta."""
def f_1(y):
low, high = 0, float(y)
last, mid = 0, high/2
while abs(mid-last) > delta:
if f(mid) < y:
low = mid
else:
high = mid
last, mid = mid, (low + high)/2
return mid
return f_1
#Newton's …Run Code Online (Sandbox Code Playgroud) 我有定期进行调查的用户。该系统具有多个调查,从指定日期的最后一次发布的特定类型调查的提交日期起,它会按设定的时间间隔发布。
class Survey(Model):
name = CharField()
description = TextField()
interval = DurationField()
users = ManyToManyField(User, related_name='registered_surveys')
...
class SurveyRun(Model):
''' A users answers for 1 taken survey '''
user = ForeignKey(User, related_name='runs')
survey = ForeignKey(Survey, related_name='runs')
created = models.DateTimeField(auto_now_add=True)
submitted = models.DateTimeField(null=True, blank=True)
# answers = ReverseForeignKey...
Run Code Online (Sandbox Code Playgroud)
因此,使用上述模型时,应提醒用户A该日期下一次进行调查:
A.interval + SurveyRun.objects.filter(
user=user,
survey=A
).latest('submitted').submitted
Run Code Online (Sandbox Code Playgroud)
我想运行一个每日定期任务,该任务查询所有用户并根据以下条件为所有进行调查的用户创建新运行:
对于每个调查,都向用户注册:
submitted=None),并且最近一次的提交日期加上该调查的间隔为<=今天,请为该用户调查组合创建一个新运行并发出警报用户理想情况下,我可以创建一个管理器方法,该方法使用以下surveys_due字段进行注释:
users_with_surveys_due = User.objects.with_surveys_due().filter(surveys_due__isnull=False)
Run Code Online (Sandbox Code Playgroud)
其中带注释的字段将是Survey对象的查询集,用户需要为其提交新一轮的答案。我可以发出这样的警报:
for user in users_with_surveys_due.all():
for survey in user.surveys_due:
new_run …Run Code Online (Sandbox Code Playgroud) 对于作业,我们被要求定义一个斐波纳契函数,我用这个完成了:
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
Run Code Online (Sandbox Code Playgroud)
但是,我已经看到了递归函数,例如在一行返回语句中定义的阶乘函数,如下所示:
def factorial(n):
return n > 1 and n * factorial(n-1) or 1
Run Code Online (Sandbox Code Playgroud)
所以,我试图将其应用于我的斐波那契函数.经过几次尝试后,我得到它适用于所有测试用例,除非s = 0,在这种情况下,当它应该返回0时返回False.这是我的位置:
def fibonacci(n):
return ((n == 0 or n == 1) and n) or (n > 1 and (fibonacci(n-1) + fibonacci(n-2)))
Run Code Online (Sandbox Code Playgroud)
我知道python将0计算为False,那么当n为0时,如果保持代码的当前长度/结构,我将如何让python返回零而不是False?这甚至可能吗?
此外,这种创建函数(递归或其他)的风格是否比教科书版本更好或更不可取/ pythonic?(我想象的不仅仅是因为可读性)
为了清楚起见,我已经满足了作业的要求,而且仅仅为了个人知识,我想更清楚地了解回报声明中发生的事情.
完成使用迭代函数创建pascal三角形的赋值后,我尝试使用递归函数重新创建它.我已经达到了这样的程度,我可以通过它来生成与作为参数传入的数字相对应的单独行.但有几次尝试让它产生整个三角形直到并包括那一行都失败了.我甚至尝试编写一个单独的函数,它迭代输入数字的范围,并使用迭代数字调用递归函数,同时在返回该列表之前将各行附加到列表.所需的输出应该是列表,其中每个内部列表包含三角形的一行.像这样:
[[1], [1, 1], [1, 2, 1]...]
Run Code Online (Sandbox Code Playgroud)
相反,它返回一个完全填充1的嵌套列表的乱七八糟的混乱.
这是有问题的递归函数,没有附加行的第二个函数(我真的想要1个全包函数):
def triangle(n):
if n == 0:
return []
elif n == 1:
return [1]
else:
new_row = [1]
last_row = triangle(n-1)
for i in range(len(last_row)-1):
new_row.append(last_row[i] + last_row[i+1])
new_row += [1]
return new_row
Run Code Online (Sandbox Code Playgroud)
要清楚,我已经完成了分配的任务,这只是为了更深入地理解递归...
迭代解决方案:
def triangle(n):
result = []
for row in range(n):
newrow = [1]
for col in range(1, row+1):
newcell = newrow[col-1] * float(row+1-col)/col
newrow.append(int(newcell))
result.append(newrow)
return result
Run Code Online (Sandbox Code Playgroud) 对于家庭作业,我们需要创建一个函数,它接受两个输入(列表和一个字符串)并返回一个列表.我想使用list comprehension编写这个函数,但是一直遇到一个烦人的问题.这是他想要重写的原创函数:
index = [['keyword1', ['url1', 'url2', 'url3']], ['keyword2', ['url4', 'url5']]...]
def lookup(index, keyword):
result = []
for entry in index:
if entry[0] == keyword:
result += entry[1]
return result
Run Code Online (Sandbox Code Playgroud)
这些是我尝试使用列表理解:
def lookup(index, keyword):
return [entry[1] for entry in index if entry[0] == keyword]
def lookup(index, keyword):
return [ulist for key, ulist in index if i == keyword]
Run Code Online (Sandbox Code Playgroud)
最后......
def lookup(index, keyword):
return [j for j in (entry[1] for entry in index if entry[0] == keyword)]
Run Code Online (Sandbox Code Playgroud)
这里的问题是它在列表中的列表中返回所需的URL,如下所示:
[['url1', 'url2', 'url3']] …Run Code Online (Sandbox Code Playgroud) 为什么这不起作用?
def straight(ranks):
"Return True if the ordered ranks form a 5-card straight."
return range(max(ranks)-4, max(ranks)+1) == ranks.sort()
Run Code Online (Sandbox Code Playgroud)
假设排名是:
>>> ranks = [9, 8, 7, 6, 5]
>>> range(max(ranks)-4, max(ranks)+1)
[5, 6, 7, 8, 9]
>>> ranks.sort()
[5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
那么为什么:
>>> range(max(s)-4,max(s)+1) == s.sort()
False
Run Code Online (Sandbox Code Playgroud) 如何从字符串中检索预期的格式键名称?
可以说我有:
"This string expects {expected}"
Run Code Online (Sandbox Code Playgroud)
如果我输入错误的键名,python 会抛出一个 KeyError,显示预期的名称。
"This string expects {expected}".format(whoops="wrong key")
KeyError: 'expected'
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以在没有正则表达式或(呃)故意抛出 KeyError 的情况下对此进行测试?我查看了字符串文档,但什么也没引起我的注意。
编辑1:
我不想抑制错误,也不想默默地用 None/空字符串填充它。我想使用预期的键名来正确格式化字符串。
我可以通过将字符串映射到字典中的键名来在上游重新处理它,但希望如果有办法在事后找到它来避免这种情况。
正则表达式将是一个很好的解决方案,但此时我只是好奇。
我正在完成一个基于文本的游戏,用于介绍python类.它不完整但我正在处理main_menu函数以及在遇到此错误消息时在main_menu函数内调用的函数.我在学习经历中多次遇到过这个错误,这通常归因于分配变量时的一个基本错误,但是这个让我感到困惑......这是有问题的脚本(回溯中的行以BOLD命名):
import random
from sys import exit
# Item variables
coal = ('Coal', 'some coal which can be used in a furnace.')
eng_key = ('Key', 'a key to a house.')
bomb = ('Bomb', 'a combustible device which creates a powerfull explosion. Possibly used for demolition...')
tonic = ('Tonic', 'a weak healing tonic. Adds \'5\' health points.')
sTonic = ('Super Tonic', 'a strong healing tonic. Adds \'10\' health points.')
# LOCATIONS
# Below are the possible locations you can …Run Code Online (Sandbox Code Playgroud) 我想以更简洁的方式编写下面的函数:
def sum_list(l):
x = 0
for i in l:
x += i
return x
Run Code Online (Sandbox Code Playgroud)
我知道我可以轻松地做到这一点:
def sum_list(l):
return sum(l)
Run Code Online (Sandbox Code Playgroud)
但是为了更好地理解python,我一直在修改生成器和列表理解.
所以我尝试过:
def sum_list(l):
x = 0
return (x += i for i in l)
Run Code Online (Sandbox Code Playgroud)
但这只是返回生成器对象.我记得在某个地方读过它应该在像sum()这样的操作中使用,或者沿着这些行的某些东西,但我似乎找不到那篇文章了.
有人可以指出我的一些文献的方向,或者可能花时间解释一些围绕这种性质的基础知识吗?