我理解函数如何在for循环中使用range()
和zip()
可以使用.但是我希望range()
输出一个列表 - 就像seq
在unix shell中一样.如果我运行以下代码:
a=range(10)
print(a)
Run Code Online (Sandbox Code Playgroud)
输出是range(10)
,表明它不是列表而是不同类型的对象.zip()
打印时有类似的行为,输出类似的东西
<zip object at "hexadecimal number">
Run Code Online (Sandbox Code Playgroud)
所以我的问题是它们是什么,有什么优势使它们成为现实,如何在没有循环的情况下将它们的输出发送到列表?
由于某些原因我无法解释或google,即使用最简单的例子,py2app也会崩溃.我使用python 3.4.1虚拟环境创建,Projects/Test/virtenv
其中py2app通过pip安装.
这是输出$pip list
:
altgraph (0.12)
macholib (1.7)
modulegraph (0.12)
pip (1.5.6)
py2app (0.9)
setuptools (3.6)
Run Code Online (Sandbox Code Playgroud)
foo.py是一个保存在Projects/Test /中的hello world示例文件,包含一行:
print('hello world')
Run Code Online (Sandbox Code Playgroud)
setup.py保存在Projects/Test中,生成者$py2applet --make-setup foo.py
:
"""
This is a setup.py script generated by py2applet
Usage:
python setup.py py2app
"""
from setuptools import setup
APP = ['foo.py']
DATA_FILES = []
OPTIONS = {'argv_emulation': True}
setup(
app=APP,
data_files=DATA_FILES,
options={'py2app': OPTIONS},
setup_requires=['py2app'],
)
Run Code Online (Sandbox Code Playgroud)
这是运行的完整输出$python setup.py py2app
(所有pip和python命令都是在激活虚拟环境的情况下完成的):
running py2app
creating /Users/mik/Desktop/Projects/Test/build
creating /Users/mik/Desktop/Projects/Test/build/bdist.macosx-10.8-x86_64
creating /Users/mik/Desktop/Projects/Test/build/bdist.macosx-10.8-x86_64/python3.4-standalone
creating /Users/mik/Desktop/Projects/Test/build/bdist.macosx-10.8-x86_64/python3.4-standalone/app …
Run Code Online (Sandbox Code Playgroud) 我有几乎相同的问题这却与蟒蛇.打印大量文本甚至会破坏我的崇高文本.不幸的是,所描述的解决方案特定于Clojure.有任何想法吗?
澄清:如果代码打印的东西太快而没有延迟,我会遇到速度减慢.这段代码会这样做:
for x in range(1000000):
print(x)
Run Code Online (Sandbox Code Playgroud) 据我所知,在Python中,常规的c ++样式变量赋值被替换为对东西的引用即
a=[1,2,3]
b=a
a.append(4)
print(b) #gives [1,2,3,4]
print(a) #gives [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)
但我仍然困惑为什么与基本类型的类似情况,例如.整数的工作方式不同?
a=1
b=a
a+=1
print(b) # gives 1
print(a) # gives 2
Run Code Online (Sandbox Code Playgroud)
但等等,当我们考虑循环时,它会变得更加混乱!
li=[1,2,3]
for x in li:
x+=1
print(li) #gives [1,2,3]
Run Code Online (Sandbox Code Playgroud)
这是我的预期,但如果我们这样做会发生什么:
a,b,c=1,2,3
li=[a,b,c]
for x in li:
x+=1
print(li) #gives [1,2,3]
Run Code Online (Sandbox Code Playgroud)
也许我的问题应该是如何遍历整数列表并在没有map()的情况下更改它们,因为我需要一个if语句.我唯一能做的就是没用
for x in range(len(li)):
Do stuff to li[x]
Run Code Online (Sandbox Code Playgroud)
将整数打包在一个元素列表中.但必须有更好的方法.
最近我想使用并行处理加速我的一些代码,因为我有一个四核i7,它似乎是浪费.我学习了python(我使用v 3.3.2,如果它匹配)GIL以及如何使用多处理模块克服它,所以我写了这个简单的测试程序:
from multiprocessing import Process, Queue
def sum(a,b):
su=0
for i in range(a,b):
su+=i
q.put(su)
q= Queue()
p1=Process(target=sum, args=(1,25*10**7))
p2=Process(target=sum, args=(25*10**7,5*10**8))
p3=Process(target=sum, args=(5*10**8,75*10**7))
p4=Process(target=sum, args=(75*10**7,10**9))
p1.run()
p2.run()
p3.run()
p4.run()
r1=q.get()
r2=q.get()
r3=q.get()
r4=q.get()
print(r1+r2+r3+r4)
Run Code Online (Sandbox Code Playgroud)
使用cProfile测量的代码运行大约48秒,但是单个进程代码
def sum(a,b):
su=0
for i in range(a,b):
su+=i
print(su)
sum(1,10**9)
Run Code Online (Sandbox Code Playgroud)
在大约50秒内运行.我知道这种方法有开销,但我预计改进会更加激烈.fork()的错误不适用于我,因为我在Mac上运行代码.
python ×5
python-3.x ×3
macos ×2
iterator ×1
list ×1
loops ×1
py2app ×1
range ×1
sublimerepl ×1
sublimetext3 ×1
variables ×1