相关疑难解决方法(0)

"yield"关键字有什么作用?

yieldPython中关键字的用途是什么?它有什么作用?

例如,我试图理解这段代码1:

def _get_child_candidates(self, distance, min_dist, max_dist):
    if self._leftchild and distance - max_dist < self._median:
        yield self._leftchild
    if self._rightchild and distance + max_dist >= self._median:
        yield self._rightchild  
Run Code Online (Sandbox Code Playgroud)

这是来电者:

result, candidates = [], [self]
while candidates:
    node = candidates.pop()
    distance = node._get_dist(obj)
    if distance <= max_dist and distance >= min_dist:
        result.extend(node._values)
    candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))
return result
Run Code Online (Sandbox Code Playgroud)

_get_child_candidates调用该方法时会发生什么?列表是否返回?单个元素?它又被召唤了吗?后续通话何时停止?


1.代码来自Jochen Schulz(jrschulz),他为度量空间创建了一个很棒的Python库.这是完整源代码的链接:模块mspace.

python iterator yield generator coroutine

9664
推荐指数
46
解决办法
212万
查看次数

如何写斐波纳契数列?

我最初错误地编写了程序.我没有在一个范围(即startNumber 1,endNumber 20应该=只有1和20之间的数字)之间返回Fibonacci数,而是为程序编写了显示范围之间的所有Fibonacci数(即startNumber 1,endNumber 20)显示=前20个斐波纳契数).我以为我有一个确定的代码.我也不明白为什么会这样.

startNumber = int(raw_input("Enter the start number here "))
endNumber = int(raw_input("Enter the end number here "))

def fib(n):
    if n < 2:
        return n
    return fib(n-2) + fib(n-1)

print map(fib, range(startNumber, endNumber))
Run Code Online (Sandbox Code Playgroud)

有人在我的第二部分(因为重复而关闭 - /sf/ask/35293541/)指出我需要使用while循环通过生成器传递startNumber和endNumber.有人可以指点我如何做到这一点?欢迎任何帮助.


我是一名学习程序员,而且我遇到了一些混乱.我被要求编写一个程序,用于通过用户输入的起始编号和结束编号来计算和显示斐波纳契序列(即startNumber = 20 endNumber = 100,它将仅显示该范围之间的数字).诀窍是包含它(我不知道如何在Python中使用它? - 我假设这意味着使用包含范围?).

到目前为止我所拥有的不是实际编码,而是:

  • 将Fib序列公式写为无穷大
  • 仅从Fib序列显示startNumber到endNumber.

我不知道从哪里开始,我正在询问如何写这个的想法或见解.我也尝试过编写Fib序列论坛,但我也迷失了.

python sequences fibonacci

134
推荐指数
7
解决办法
62万
查看次数

"列表理解"是什么意思?它是如何工作的,我该如何使用它?

我有以下代码:

[x ** 2 for x in range(10)]
Run Code Online (Sandbox Code Playgroud)

当我在Python Shell中运行它时,它返回:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Run Code Online (Sandbox Code Playgroud)

我搜索过,似乎这被称为列表理解,但它是如何工作的?

python list-comprehension list

46
推荐指数
4
解决办法
4792
查看次数

发电机是否可以调用?哪个是发电机?

生成器只是一个函数,它返回一个可以在其上调用的对象,这样每次调用它都会返回一些值,直到它引发一个StopIteration异常,表示已生成所有值.这样的对象称为迭代器.

>>> def myGen(n):
...     yield n
...     yield n + 1
... 
>>> g = myGen(6)
Run Code Online (Sandbox Code Playgroud)

我从Python中理解生成器中引用了这个

这是我想弄清楚的:

  1. 哪个是发电机?myGen还是myGen(6)

    根据上面提到的报价,我认为发电机应该是myGen.并且myGen(6)是返回的迭代器对象.但我真的不确定.

  2. 当我尝试这个时:

    >>> type(myGen)
    <type 'function'>
    >>> type(g)         # <1>this is confusing me.
    <type 'generator'>  
    >>> callable(g)     # <2> g is not callable.  
    False               
    >>> callable(myGen)
    True
    >>> g is iter(g)    # <3> so g should an iterable and an iterator 
    True                # at the same time. And it …
    Run Code Online (Sandbox Code Playgroud)

python generator callable

14
推荐指数
1
解决办法
3152
查看次数

sklearn Kfold访问单折而不是循环

在使用cross_validation.KFold(n,n_folds = folds)之后,我想访问索引以进行单折的训练和测试,而不是遍历所有折叠.

那么我们来看一下示例代码:

from sklearn import cross_validation
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([1, 2, 3, 4])
kf = cross_validation.KFold(4, n_folds=2)

>>> print(kf)  
sklearn.cross_validation.KFold(n=4, n_folds=2, shuffle=False,
                           random_state=None)
>>> for train_index, test_index in kf:
Run Code Online (Sandbox Code Playgroud)

我想像这样访问kf中的第一个折叠(而不是for循环):

train_index, test_index in kf[0]
Run Code Online (Sandbox Code Playgroud)

这应该只返回第一个折叠,但我得到错误:"TypeError:'KFold'对象不支持索引"

我想要的输出:

>>> train_index, test_index in kf[0]
>>> print("TRAIN:", train_index, "TEST:", test_index)
TRAIN: [2 3] TEST: [0 1]
Run Code Online (Sandbox Code Playgroud)

链接:http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.KFold.html

如何检索列车和测试的索引只有一个折叠,而不通过整个for循环?

python scikit-learn cross-validation

13
推荐指数
1
解决办法
8585
查看次数

使用Openpyxl将边界应用于单元格区域

我使用的是python 2.7.10和openpyxl 2.3.2,我是一个Python新手.

我正在尝试将边框应用于Excel工作表中的指定范围的单元格(例如C3:H10).我在下面的尝试失败,并显示以下消息:

AttributeError:'Cell'对象没有属性'styles'.

如何将边框附加到单元格?任何见解都会感激不尽.

我目前的代码:

import openpyxl
from openpyxl.styles import Border, Side

def set_border(ws, cell_range):
    rows = ws.iter_rows(cell_range)
    for row in rows:
        row[0].styles.borders = Border(left=Side(border_style='thin', color="FF000000"))
        row[-1].styles.borders = Border(right=Side(border_style='thin', color="FF000000"))
    for c in rows[0]:
        c.styles.borders = Border(top=Side(border_style='thin', color="FF000000"))
    for c in rows[-1]:
        c.styles.borders = Border(bottom=Side(border_style='thin', color="FF000000"))


# Example call to set_border
wb = openpyxl.load_workbook('example.xlsx')
ws = wb.get_sheet_by_name('Sheet1')

set_border(ws, "B3:H10")
Run Code Online (Sandbox Code Playgroud)

python excel openpyxl

6
推荐指数
1
解决办法
9465
查看次数

Pandas计算groupby对象内的连续日期观察值

这是我正在使用的数据框的一个例子:

d = {
'item_number':['bdsm1000', 'bdsm1000', 'bdsm1000', 'ZZRWB18','ZZRWB18', 'ZZRWB18', 'ZZRWB18', 'ZZHP1427BLK', 'ZZHP1427', 'ZZHP1427', 'ZZHP1427', 'ZZHP1427', 'ZZHP1427', 'ZZHP1427', 'ZZHP1427', 'ZZHP1427', 'ZZHP1427', 'ZZHP1427', 'ZZHP1427', 'ZZHP1427', 'ZZHP1414', 'ZZHP1414', 'ZZHP1414', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115WNTR', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE', 'WRM115SCFRE'],
'Comp_ID':[2454, 2454, 2454, 1395, 1395, 1395, 1395, 3378, 1266941, 660867, 43978, 1266941, 660867, 43978, 1266941, 660867, 43978, 1266941, 660867, 43978, 43978, 43978, 43978, 1197347907, 70745, 4737, 1197347907, …
Run Code Online (Sandbox Code Playgroud)

python pandas

6
推荐指数
1
解决办法
1648
查看次数

Python - 确定井字游戏的赢家

我正在尝试编写一个代码来确定井字游戏的获胜者。(这是一个大学作业)

为此,我编写了以下函数:

这段代码只检查水平线,我没有添加其余的。我觉得这是需要一些硬编码的东西。

def iswinner(board, decorator):
    win = True
    for row in range(len(board)):
        for col in range(len(board)):
            if board[row][col] == decorator:
                win = True
            else:
                win = False
                break
Run Code Online (Sandbox Code Playgroud)

其中“board”是大小为 n^2 的二维数组,“decorator”是“X”或“O”值

我希望完成的是该函数循环遍历二维数组的行。然后循环遍历每一行中的值。如果该元素与“装饰器”匹配,则它继续并检查下一个,但如果不匹配,则它从第一个循环中断并转到下一行。它会这样做,直到在同一行中找到 n 个元素。然后它会给出一个布尔值 True 否则为 False。

代码似乎没有这样做,即使我检查了以下“板”,它也给了我“真”的输出

check_list = [['O', 'X', 'X'],
              ['O', 'X', 'O'],
              ['O', 'X', 'X']]
Run Code Online (Sandbox Code Playgroud)

非常感谢!

最好的,赛义德

python arrays loops boolean break

5
推荐指数
2
解决办法
2万
查看次数

在巨大的熊猫数据框的文本列上创建一个 TfidfVectorizer

我需要从存储在巨大数据框列中的文本中获取 TF-IDF 特征矩阵,从 CSV 文件(无法放入内存)加载。我正在尝试使用块迭代数据帧,但它返回的生成器对象不是TfidfVectorizer方法的预期变量类型。我想我在编写ChunkIterator如下所示的生成器方法时做错了什么。

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer


#Will work only for small Dataset
csvfilename = 'data_elements.csv'
df = pd.read_csv(csvfilename)
vectorizer = TfidfVectorizer()
corpus  = df['text_column'].values
vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names())



#Trying to use a generator to parse over a huge dataframe
def ChunkIterator(filename):
    for chunk in pd.read_csv(csvfilename, chunksize=1):
       yield chunk['text_column'].values

corpus  = ChunkIterator(csvfilename)
vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names())
Run Code Online (Sandbox Code Playgroud)

任何人都可以请教如何修改上述ChunkIterator方法,或使用dataframe 的任何其他方法。我想避免为数据框中的每一行创建单独的文本文件。以下是一些用于重新创建场景的虚拟 csv 文件数据。

id,text_column,tags
001, This is the first …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas scikit-learn tfidfvectorizer

5
推荐指数
1
解决办法
2025
查看次数

接收和发出返回值的 Python 协程

我正在阅读 Python Essential Reference,但我无法理解接收和发出返回值的协程。

这就是作者所说的 - “如果在 yield 表达式中提供了值,协程可以使用 yield 同时接收和发出返回值。”

下面是一个示例,说明了这一点:

def line_splitter(delimiter=None):
    print("Ready to split")
    result = None
    while True:
        line = (yield result)
        result = line.split(delimiter)
Run Code Online (Sandbox Code Playgroud)

作者进一步补充说,在这种情况下,我们以与以前相同的方式使用协程。但是,现在对 send() 的调用也会产生结果。例如:

>>> s = line_splitter(",")
>>> s.next()
Ready to split
>>> s.send("A,B,C")
['A', 'B', 'C' ]
>>> s.send("100,200,300")
['100', '200', '300']
Run Code Online (Sandbox Code Playgroud)

我想知道上面的代码是如何工作的。

谢谢你的帮助。

python functional-programming python-2.7

4
推荐指数
1
解决办法
649
查看次数