我正在尝试用Pygame和asyncio编写一个网络游戏,但我无法弄清楚如何避免挂起读取.这是我的客户代码:
@asyncio.coroutine
def handle_client():
print("Connected!")
reader, writer = yield from asyncio.open_connection('localhost', 8000)
while True:
mouse_up = False
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONUP:
mouse_up = True
if mouse_up:
print("Writing")
writer.write(b"Mouse up")
print("Waiting to read")
line = yield from reader.read(2**12)
print(line.decode())
writer.close()
Run Code Online (Sandbox Code Playgroud)
这就行了line = yield from reader.read(2**12).我以前认为asyncio的意思是它是非阻塞的,所以如果没有任何数据可以读取它就会继续执行.我现在看到情况并非如此.
如何将asyncio网络代码与Pygame绘图和事件代码集成?
我正在使用nltk的wordnet API.当我将一个synset与另一个synset进行比较时,我得到了None但是当我比较它们时,我得到一个浮点值.
他们不应该给出相同的价值吗?有解释还是这是wordnet的错误?
例:
wn.synset('car.n.01').path_similarity(wn.synset('automobile.v.01')) # None
wn.synset('automobile.v.01').path_similarity(wn.synset('car.n.01')) # 0.06666666666666667
Run Code Online (Sandbox Code Playgroud) 我很好奇http://docs.python.org/2/library/itertools.html#itertools.imap上的一条声明,即它描述了
sum(imap(operator.mul, vector1, vector2))
Run Code Online (Sandbox Code Playgroud)
作为一个有效的点产品.我的理解是imap给出了一个生成器而不是一个列表,虽然我理解如果你只考虑前几个元素,周围的sum(),它会更快/消耗更少的内存,我不知道如何它的行为与:
sum(map(operator.mul, vector1, vector2))
Run Code Online (Sandbox Code Playgroud) Python程序通常简洁明了,通常需要其他编程语言(我知道)的一堆行可以在python中用一行或两行完成.我试图编写的一个这样的程序是从字符串中提取所有其他字母.我有这个工作代码,但想知道是否有其他简洁方法可行?
>>> s
'abcdefg'
>>> b = ""
>>> for i in range(len(s)):
... if (i%2)==0:
... b+=s[i]
...
>>> b
'aceg'
>>>
Run Code Online (Sandbox Code Playgroud) 我想要一个行为类似的函数enumerate,但是在numpy数组上.
>>> list(enumerate("hello"))
[(0, "h"), (1, "e"), (2, "l"), (3, "l"), (4, "o")]
>>> for x, y, element in enumerate2(numpy.array([[i for i in "egg"] for j in range(3)])):
print(x, y, element)
0 0 e
1 0 g
2 0 g
0 1 e
1 1 g
2 1 g
0 2 e
1 2 g
2 2 g
Run Code Online (Sandbox Code Playgroud)
目前我正在使用此功能:
def enumerate2(np_array):
for y, row in enumerate(np_array):
for x, element in enumerate(row):
yield (x, y, element)
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点?例如内置函数(我找不到任何内容),或者以某种方式更快的不同定义.
我正在写一个HTTP服务器(仅用于教育自己).
典型的GET请求似乎是这样的:
GET /?a=1&b=2 HTTP/1.1
Host: localhost
User-Agent: my browser details
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Run Code Online (Sandbox Code Playgroud)
我能看到发送变量的唯一地方是第一行.编写一个正则表达式以获取变量及其内容是很容易的,但我想知道是否有更简单的方法.我问,因为我一直认为这个概念url?first_variable=first_value&second_variable=second_value是协议的一部分,并且在某种程度上是特殊的.但是,据我所知,情况并非如此,我也可以做同样的url$first_variable-first_value?second_variable-second_value事情.
我在Python之后学习Haskell,我认为创建一个函数可以找到序列中不在另一个序列中的所有项(两个序列都有可以比较的元素)将是一个有趣的练习.我在Python中轻松地为此编写了一些代码:
def inverse(seq, domain):
ss = iter(seq)
dd = iter(domain)
while True:
s = next(ss)
while True:
d = next(dd)
if d != s:
yield d
if d >= s:
break
Run Code Online (Sandbox Code Playgroud)
(其中两个seq和domain排序)
但是,我努力将此代码转换为Haskell.我相信我只是使用列表(可能是无限的),而不是ss和dd,我想我会使用s = next(ss)相同s = head ss和ss = tail ss,但我无法弄清楚如何我翻译成哈斯克尔.我也无法解决我对这两个while循环所做的事情.我认为我可以使用无限递归,但由于有两个循环我不知道是否需要两个函数或什么.
等的行为freq = "W-SUN"似乎令人困惑且不一致。例如,d.date_range(pd.Timestamp('2019-07-09'), pd.Timestamp('2019-11-11'), freq='W-SUN')生成一系列星期日,但pd.Index([pd.Timestamp('2019-07-09')]).to_period('W-SUN').to_timestamp()生成星期一。这里发生了什么?
出现这种情况是因为我有一个日期索引,我想将其舍入到某个频率,同时还生成date_range具有相同频率和相位的日期索引。看起来应该适用index.to_period(freq).to_timestamp()于此pd.date_range(start, end, freq=freq),但当 freq 为 时则不然"W-DAY"。
双函数有一个具有以下签名的映射函数:
bimap :: (a -> b) -> (c -> d) -> p a c -> p b d
Run Code Online (Sandbox Code Playgroud)
你也可以有这样的地图:
othermap :: ((a, c) -> (b, d)) -> p a c -> p b d
Run Code Online (Sandbox Code Playgroud)
具有此函数的类型是双函子的严格子集(您始终可以定义bimapusing othermap,但反之则不然)。第二个签名有名字吗?
追问:这个中间函数呢?
halfothermap :: ((a, c) -> b) -> (c -> d) -> p a c -> p b d
Run Code Online (Sandbox Code Playgroud) 我想使用一些生成器表达式作为一些昂贵的数据计算的属性.如果可能的话,我希望能够做到这样的事情:
class Test:
def __init__(self):
self.data = []
self.evens = (i for i in self.data if i % 2 == 0)
def __main__():
t = Test()
t.data = [1,2,3,4,5,6,7,8]
for item in t.evens:
print(item)
if __name__ == '__main__':
__main__()
Run Code Online (Sandbox Code Playgroud)
我希望看到这个打印输出,2 4 6 8但这没有输出.我在这里犯了一些简单的错误吗?
我想在这里做什么可能或我需要yield用来做这个?