我喜欢Python的原因之一是由元组,列表,集合和字典提供的表达能力/减少编程工作.一旦你理解了列表理解和一些使用IN和FOR的基本模式,生活就会变得更好!Python摇滚.
但是我确实想知道为什么这些结构会被视为不同,以及随着时间的推移它会如何变化(变得陌生).回到Python 2.x,我本可以提出一个论点,它们只是基本集合类型的变体,并且有些令人恼火的是,一些非常外用例需要您将字典转换为列表并再次返回.(字典不仅仅是具有特定唯一性约束的元组列表吗?列表不是仅具有不同类型的唯一性约束的集合吗?).
现在在3.x世界中,它变得更加复杂.现在有名为元组 - 开始感觉更像是一个特例字典.现在有订单的词典 - 开始感觉更像是一个列表.我刚看到有序套装的配方.我可以想象一下这个......还有什么独特的清单等等.
Python的禅宗说"应该有一个 - 最好只有一个 - 明显的方式".在我看来,这种专门的集合类型的大量与这个Python规则相冲突.
硬核Pythonistas的想法是什么?
关于这个问题的不同方面的许多帖子,但我没有看到一个将所有这些结合在一起的帖子.
首先是一个主观陈述:当我们移出解释器并开始解决部署问题时,我们在使用Python语言时遇到的简单性似乎就像是分段.如何在同一台机器上拥有多个版本的Python?应该在哪里安装包裹?Disutils vs. setuptools vs. pip等.在部署方面,似乎Python的Zen被滥用得非常糟糕.我对Windows上的"DLL地狱"体验感到怪异的回声.
专家们是否同意这些问题的某种程度的最佳实践?
你在同一台机器上运行多个版本的Python吗?你如何仍然相信,他们可以共存 - 和较新的版本不会破坏依赖于早期版本的其他进程的假设(由操作系统供应商提供的脚本,例如)?这样安全吗?virtualenv足够吗?
在本地文件系统上,Python环境的不同组件(包括第三方软件包)的位置的最佳选择是什么?对于可以依赖的许多不同版本的Unixy和Windows操作系统,位置之间是否存在严格或粗略的对应关系?
沼泽中最阴暗的角落 - 你使用什么安装工具(setuptools,distutils,pip等),并且它们适合您的选择:文件位置,Python虚拟环境,Python路径等.
这些听起来像是难题.我希望经验丰富的Pythonistas可能已经为这些挑战定义了一种规范的方法(或两种方法).任何"挂在一起"作为一个可以放心使用的系统的方法(感觉不像是单独的,不相关的工具)将是非常有帮助的.
collections.defaultdict
是很棒的.特别是与lambda
:
>>> import collections
>>> a = collections.defaultdict(lambda : [None,None])
>>> a['foo']
[None, None]
Run Code Online (Sandbox Code Playgroud)
有没有办法'foo'
在lambda中使用给定的键(例如)?例如(不起作用):
>>> a = collections.defaultdict(lambda : [None]*key)
>>> a[1]
[None]
>>> a[2]
[None, None]
>>> a
defaultdict(<function <lambda> at 0x02984170>, {1: [None], 2: [None, None]})
Run Code Online (Sandbox Code Playgroud) 列表,集和词典的Python原生功能完全摇滚.当数据变得非常大时,有没有办法继续使用本机功能?我正在处理的问题涉及非常大的列表的匹配(交集).我还没有突破限制 - 实际上我并不知道限制是什么 - 并且不希望在数据按预期增长之后重新实现大的重复.
是否合理部署在谷歌应用引擎之类的东西上,宣传没有实际的规模限制并继续使用本机功能,而不是真的考虑这个?
是否存在一些Python魔法,可以隐藏列表,集合或字典是否在Python管理的内存中而不是数据库中 - 因此数据的物理部署可以与我在代码中的操作保持不同?
您是如何处理Python超级专家先生或女士,随着数据量的增长处理列表,设置和决策?
通过 add_to_class() 添加字段时,我的模型继承存在问题。我有一个模型File(models.Model)
和Image(File)
-这些来自Django的文件管理器。
在我的应用程序中,我正在导入它们并添加字段和方法:
def method_x(self):
print "x"
File.add_to_class("expiration_date", models.DateField(null=True, blank=True))
File.add_to_class("method_x", method_x)
Run Code Online (Sandbox Code Playgroud)
Image 应该继承这两个,但它只获取方法,而不是字段:
>>> some_file = File.objects.get(id=8)
>>> some_image = Image.objects.get(id=8)
>>>
>>> print some_file.expiration_date # this works
... None
>>>
>>> some_image.metgod_x() # this works
>>> x
>>>
>>> print some_image.expiration_date # and this not
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'Image' object has no attribute 'expiration_date'
Run Code Online (Sandbox Code Playgroud)
有什么线索吗?
假设您有一个系统,通过电子邮件或纸张可以在屏幕上准确地传达相当长的键值; 但是用户需要能够通过电话阅读,或者通过阅读并将其键入其他界面来准确地将密钥传回给您.
对键进行编码的"好"方法是什么,使阅读/听觉/打字简单准确?
这可以是发票号,文档ID,事务ID或一些其他抽象值.让我们说为了这个讨论,底层的键值是一个很大的数字,比如10的基数.
一些想法:
较短的键通常更好
不能在视觉上相互混淆的角色更好
不能在口头/听觉上相互混淆的角色更好
添加一两个校验位将检测错误但无法帮助解决错误.
alpha - bravo - charlie - delta类型对话框可以帮助解决听力错误,但不能读取错误.
可能的编码选择:
对于这种情况,是否有一个公认的编码是合理的解决方案?
我现在已经使用python了一段时间,过去一直没有任何错误地使用email函数,但是在最新程序上,我已经使我遇到了这个错误
Traceback (most recent call last):
File "daemon.py", line 62, in <module>
scraper.run()
File "c:\cfsresd\scraper.py", line 48, in run
self.scrape()
File "c:\cfsresd\scraper.py", line 44, in scrape
handler(msg)
File "daemon.py", line 57, in handler
server.ehlo()
File "C:\Python27\lib\smtplib.py", line 385, in ehlo
self.putcmd(self.ehlo_msg, name or self.local_hostname)
File "C:\Python27\lib\smtplib.py", line 318, in putcmd
self.send(str)
File "C:\Python27\lib\smtplib.py", line 310, in send
raise SMTPServerDisconnected('please run connect() first')
smtplib.SMTPServerDisconnected: please run connect() first
Run Code Online (Sandbox Code Playgroud)
我为所有项目都使用了相同的电子邮件代码,但这是第一次完成。我试过添加connect(),但这没什么区别。以下是我脚本的电子邮件部分
msg = MIMEText ('%s - %s' % (msg.text, msg.channel))
server = smtplib.SMTP('smtp.gmail.com:587') …
Run Code Online (Sandbox Code Playgroud) 我有这个代码:
$('.counter_d').mouseover(function() {
$('#description').html('Counter');
});
$('.selector_d').mouseover(function() {
$('#description').html('Selector');
});
$('.date_d').mouseover(function() {
$('#description').html('Date');
});
Run Code Online (Sandbox Code Playgroud)
还有几个,但我认为文件可以更小,甚至可以使用循环重用,但我无法将描述(HTML方法)与选择器绑定.
我想用这样的东西:
var selectors=['.counter_d','.selector_d','.date_d'];
var description=['Counter', 'Selector', 'Date'];
for(var i=0; i<selectors.length; i++)
$(selectors[i]).mouseover(function() {
$('#description').html(description[i]);
});
Run Code Online (Sandbox Code Playgroud)
有帮助吗?谢谢
我正在尝试使用 Bento、Veewee 和 Vagrant 来自动化配置虚拟机的过程。这种方法对于简化开发、开发测试和质量保证流程有很大的希望。
(对于那些没有遇到过这些的人来说——Vagrant 可以轻松地在 Virtual Box、VMWare、EC2 等中快速设置/拆除虚拟机;Veewee 简化了为 Veewee 构建基础盒子的过程;Bento 简化了定义基本框,然后自动化 Veewee 的操作)。
问题是,Bento、Veewee 和 Vagrant 的相互关系令人困惑。许多定义文件和一些操作在各层之间重复,并且不清楚哪一层应该获得特定于我的项目的更新。Ruby 环境也使这个问题变得相当复杂——看起来 Bento 命令都需要从 Bento 目录运行,所以框和其他文件最终会出现在不合逻辑的地方。
谁能建议使用这种工具组合的文件布局和工作流程?
我正在使用ubuntu 10.04作为我的桌面和Ubunt 10.04服务器版本的服务器.
以下内容:
sudo pip install -e git+http://github.com/facebook/python-sdk.git#egg=facebook
Run Code Online (Sandbox Code Playgroud)
在我的桌面上工作,但在服务器上不起作用.
在服务器上,我收到以下错误消息:
Obtaining facebook from git+http://github.com/facebook/python-sdk.git#egg=facebook
Cloning http://github.com/facebook/python-sdk.git to ./src/facebook
Exception:
Traceback (most recent call last):
File "/usr/local/lib/python2.6/dist-packages/pip/basecommand.py", line 115, in main
self.run(options, args)
File "/usr/local/lib/python2.6/dist-packages/pip/commands/install.py", line 155, in run
requirement_set.install_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle)
File "/usr/local/lib/python2.6/dist-packages/pip/req.py", line 805, in install_files
req_to_install.update_editable(not self.is_download)
File "/usr/local/lib/python2.6/dist-packages/pip/req.py", line 356, in update_editable
vcs_backend.obtain(self.source_dir)
File "/usr/local/lib/python2.6/dist-packages/pip/vcs/git.py", line 104, in obtain
[self.cmd, 'clone', '-q', url, dest])
File "/usr/local/lib/python2.6/dist-packages/pip/vcs/__init__.py", line 100, in cmd
raise BadCommand('Cannot find command %s' % …
Run Code Online (Sandbox Code Playgroud) 我试图向同事解释连接表的好处,下面是一个解释。我对么?
目前他有两张表的图片和标签之间的关系。一个图片表和一个标签表。pic 表有一个tag_id
这是标记表中条目的 FK。这是我的回应:
首先让我们看看pics
和tags
表。因此,在您当前的架构中,让我们想象两张图片(a 和 b)。我们用#wtf标签标记图片a和b。我们现在在 outtags
表中有两个条目:
pic_id title
------ -----
a wtf
b wtf
Run Code Online (Sandbox Code Playgroud)
你看到问题了吗?所以想象一下,我们在 1000 张不同的图片上有 1000 个 wtf 标签。使用相同的架构,我们现在有一个臃肿的标签表,其中包含所有这些重复数据(和浪费的空间)。当我们有多对多关系时,就会出现这个问题。在这种情况下,很多图片可以有很多标签,很多标签可以有很多图片。我们将如何解决这个问题?答案是连接表。所以我们创建了一个新表。让我们称之为pic_tag
。该表将包含列pic_id
& tag_id
。所以现在新表看起来像:
图片标签
pic_id tag_id
------ ------
a 1
b 1
Run Code Online (Sandbox Code Playgroud)
标签
id name
-- ----
1 wtf
Run Code Online (Sandbox Code Playgroud)
图片
id name
-- ----
a pic1
b pic2
Run Code Online (Sandbox Code Playgroud)
所以这对我们做了几件事。首先它节省空间。我们只存储字符串 'wtf' 一次。其次,要找到所有带有标签“wtf”的图片,我们首先转到标签表并找到“wtf”的 id,然后转到 pic_tag 表并搜索该 id,这比搜索臃肿的“标签”要高效得多' 给定文本的表格。换句话说,搜索整数比搜索文本快得多。
python ×5
collections ×2
bento ×1
database ×1
defaultdict ×1
distutils ×1
django ×1
encoding ×1
gmail ×1
inheritance ×1
jquery ×1
lambda ×1
list ×1
loops ×1
pip ×1
smtp ×1
sql ×1
terminal ×1
ubuntu ×1
ubuntu-10.04 ×1
vagrant ×1
veewee ×1
virtualenv ×1
volume ×1