我从大多数pythonic方法中遇到了这个代码,用于计算可迭代的匹配元素
r = xrange(1, 10)
print sum(1 for v in r if v % 2 == 0) # 4
print sum(1 for v in r if v % 3 == 0) # 3
Run Code Online (Sandbox Code Playgroud)
r迭代一次.然后它再次迭代.我想如果一个迭代器被消耗掉,那么它就结束了,它不应该再次迭代.
生成器表达式只能迭代一次:
r = (7 * i for i in xrange(1, 10))
print sum(1 for v in r if v % 2 == 0) # 4
print sum(1 for v in r if v % 3 == 0) # 0
Run Code Online (Sandbox Code Playgroud)
枚举(L):
r = enumerate(mylist) …
Run Code Online (Sandbox Code Playgroud) 我听说过shadow DOM,它似乎解决了Web小部件开发中的封装问题.DOM和CSS规则被封装,这有利于维护.但那不是iframes的用途吗?iframe使W3C有必要提出Shadow DOM或HTML5 Web组件有什么问题?
(push x list)
Run Code Online (Sandbox Code Playgroud)
扩展到
(setq list (cons x list))
Run Code Online (Sandbox Code Playgroud)
什么扩展到以下:
(setq list (append list2 list))
Run Code Online (Sandbox Code Playgroud)
?这有一个标准的宏吗?
"当然,我们可以想到足够罕见的名称,以便问题永远不会出现.是的,在许多情况下,软件包和智能变量命名可以解决变量捕获的问题.但是,最严重的变量捕获错误不会直接出现在代码中由程序员创建的.大多数变量捕获的问题只有表面时,其他宏使用宏的方式,你没有预料到(与宏相结合). "
然后它没有给我一个大胆的部分的例子.这样的例子之一是什么?设想一个假想的Lisp开发团队,其疯狂的老板禁止使用gensym或任何创建无符号符号的东西,程序员只需投掷字母数字骰子就可以得到随机变量名称,如temp-27s63f8sk2n或sum-3t84hj4df,只要他们错过了gensym.什么是团队陷入困境的例子?
说到这一点,Emacs 24.3.1定义了dotimes和dolist而不使用uninterned符号.奇怪的.
以下代码不会抛出AttributeError
class MyClass():
def __init__(self):
self.a = 'A'
self.b = 'B'
my_obj = MyClass()
my_obj.c = 'C'
Run Code Online (Sandbox Code Playgroud)
这与之形成鲜明对比
>>> {}.a = 'A'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'a'
Run Code Online (Sandbox Code Playgroud)
有什么区别?它是关于dict是一个内置类,而MyClass是用户定义的吗?
Google Common Lisp样式指南说避免修改局部变量,而是尝试重新绑定
这是什么意思?重新绑定在那句话中意味着什么?
CLHS说
An attempt to print a circular structure with *print-circle* set
to nil may lead to looping behavior and failure to terminate.
Run Code Online (Sandbox Code Playgroud)
然后是这样的:
为什么这个Lisp宏作为一个整体工作,即使每个部分都不起作用?
显然,*print-circle*
设置为零会导致意外.为什么*print-circle*
在许多系统上默认设置为nil?如果我从代码的开头全局设置为t,会出现什么问题?
Lisp 中(
和的正确术语是)
什么?
他们都接受条款吗?
因此,给出以下代码:
int main(void) {
int i;
i = 12.1234;
i++;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我编译了代码,我期望并希望编译器给我一个警告,但事实并非如此.我的编译器配置错了吗?有没有办法让我的编译器发出警告?
这是我用的
cc -Wall test.c
我很困惑/不确定如何使用术语变量或绑定.我认为我的不确定性可归结为三个相关的简单问题.
(let ((hi 'outer))
(let ((hi 'inner))
(print hi))
(print hi))
Run Code Online (Sandbox Code Playgroud)
问题A:在上面的代码中,以下哪项是正确的?
只有一个变量.一个变量有两个绑定:外部绑定和内部绑定.
一个名称有两个变量:外部变量和内部变量.
当我在互联网上阅读有关局部变量的文章时,有时文章似乎选择1,有时候2.两者是否同样正确?
(let ((hi 0))
(print hi)
(setq hi 1)
(print hi)
(setq hi 2)
(print hi))
Run Code Online (Sandbox Code Playgroud)
问题B:以上哪项适合上述代码?
有一个绑定正在被重用.
有三个绑定.
我从未见过任何使用单词绑定的材料,选择2作为答案,但另一方面,人们可能仍然认为"名称hi被绑定三次.三个绑定发生.代码执行三个绑定. " 所以我不确定.
(defun fac (n)
(if (> n 1)
(* n (fac (1- n)))
1))
(fac 4)
Run Code Online (Sandbox Code Playgroud)
问题C:正在执行递归函数时,哪个是正确的?
一个变量会同时绑定几个.
一个名称将同时存在多个变量.
这似乎与问题A类似,但问题A涉及两个let表单,每个表单只执行一次,而这个问题更像是一个let表单,它同时在多个实例中执行.
这些问题是针脚的角度吗?我想知道这些问题,因为关于在循环中使用闭包的着名问题有很多文章,我认为理解那些文章需要知道一个变量是什么以及一个绑定是什么.
当我编写如下代码时,我会深陷缩进
match = re.search(some_regex_1, s)
if match:
# do something with match data
else:
match = re.search(some_regex_2, s)
if match:
# do something with match data
else:
match = re.search(soem_regex_3, s)
if match:
# do something with match data
else:
# ...
# and so on
Run Code Online (Sandbox Code Playgroud)
我试着重写为:
if match = re.search(some_regex_1, s):
# ...
elif match = re.search(some_regex_2, s):
# ...
elif ....
# ...
...
Run Code Online (Sandbox Code Playgroud)
但Python不允许这种语法.在这种情况下,我该怎么做才能避免深度缩进?
我正在阅读关于修剪的维基百科文章并看到了ltrim的这种实现(左边修剪)
char *
ltrim(char *str)
{
char *ptr;
int len;
for (ptr = str; *ptr && isspace((int)*ptr); ++ptr);
len = strlen(ptr);
memmove(str, ptr, len + 1);
return str;
}
Run Code Online (Sandbox Code Playgroud)
如果我跳过memmove并返回ptr isntead会发生坏事吗?
char *
ltrim(char *str)
{
char *ptr;
int len;
for (ptr = str; *ptr && isspace((int)*ptr); ++ptr);
return ptr;
}
Run Code Online (Sandbox Code Playgroud)