我一直在浏览Python Cookbook(第2版),以了解如何处理字符串和字符.
我想尝试将数字转换为其Unicode等价物.所以我尝试使用名为' unichr '的内置函数,根据Cookbook,它是这样的:
>>> print repr(unichr(8224))
Run Code Online (Sandbox Code Playgroud)
...并将输出:
u'\u2020'
Run Code Online (Sandbox Code Playgroud)
但是,代码失败了.我认为它与print有关(因为Python 3使用print()而不是print""),但这也没有用.我尝试了几种代码变体,但仍然失败了.最后,我只输入了一个简单的行:
unichr(10000)
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,无论我在上述函数中添加了什么值,这个错误信息都会不断弹出:
NameError: name 'unichr' is not defined
Run Code Online (Sandbox Code Playgroud)
可能是什么问题呢?是否有一些我应该导入的特定模块?
我使用以下代码解决了Euler项目的问题10,该代码通过强力实施:
def isPrime(n):
for x in range(2, int(n**0.5)+1):
if n % x == 0:
return False
return True
def primeList(n):
primes = []
for i in range(2,n):
if isPrime(i):
primes.append(i)
return primes
def sumPrimes(primelist):
prime_sum = sum(primelist)
return prime_sum
print (sumPrimes(primeList(2000000)))
Run Code Online (Sandbox Code Playgroud)
这三个功能的工作原理如下:
然后我编写了一个新函数primeListRec,它与primeList完全相同,以帮助我更好地理解递归:
def primeListRec(i, n):
primes = []
#print i
if (i != n):
primes.extend(primeListRec(i+1,n))
if (isPrime(i)):
primes.append(i)
return primes
return primes
Run Code Online (Sandbox Code Playgroud)
上面的递归函数有效,但仅适用于非常小的值,如'500'.当我输入'1000'时,该功能导致我的程序崩溃.当我输入类似'2000'的值时,Python给了我这个:
RuntimeError:超出最大递归深度.
我的递归函数出了什么问题?或者是否有一些特定的方法来避免递归限制?
我的问题涉及在类构造函数之外的方法中初始化的实例变量.这适用于Python.
我先说出我的理解:
(2)和(3)的一个例子 - 参见下面的Cat类中的self.meow和self.roar:
class Cat():
def __init__(self):
self.meow = "Meow!"
def meow_bigger(self):
self.roar = "Roar!"
Run Code Online (Sandbox Code Playgroud)我的问题:
为什么在构造函数中初始化实例变量是最佳实践?
如果实例变量在构造函数以外的方法中定期初始化,可能会出现一般/特定的混乱?(例如,在他的编程Python中读过Mark Lutz的Tkinter指南,我认为这很好,我注意到用于保存PhotoImage对象/引用的实例变量在其他方法中初始化,而不是在构造函数中初始化.它似乎没有工作问题,但从长远来看,这种做法是否会引起问题?)
在哪些情况下,在其他方法中而不是在构造函数中初始化实例变量会更好?
据我所知,实例变量不是在创建类对象时存在,而是在实例化类对象之后存在.继续我上面的代码,我证明了这一点:
>> c = Cat()
>> c.meow
'Meow!'
>> c.roar
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Cat' object has no attribute 'roar'
>>> c.meow_bigger()
>>> c.roar
'Roar!'
Run Code Online (Sandbox Code Playgroud)
原样:
我试图让 D3.js 使用d3.create()生成矩形元素。它不工作/不显示。
首先,我创建一个矩形()函数,它返回一个元素:
function rectangle() {
_el = d3.create("rect")
.attr("stroke", "black")
.attr("fill", "black")
.attr("stroke-width", "10px")
.attr("x", 0)
.attr("y", 0)
.attr("width", 300)
.attr("height", 200);
return _el
}
Run Code Online (Sandbox Code Playgroud)
然后,我创建一个 SVG 选择,并在其中附加矩形().node()的实例:
const SVG_WIDTH = 1000;
const SVG_HEIGHT = 1000;
svg = d3.select("body").append("svg")
.attr("width", SVG_WIDTH)
.attr("height", SVG_HEIGHT)
.attr("id", "generated")
svg.append(
// () => rectangle().node()
function () { return rectangle().node() }
)
Run Code Online (Sandbox Code Playgroud)
然而我的浏览器(Google Chrome)中没有任何视觉输出。
然而,当我查看 DOM(通过 Chrome 的“元素”选项卡)时,D3 生成了正确的 SVG/矩形代码:
<svg width="1000" height="1000" id="generated">
<rect stroke="black" fill="black" stroke-width="10px" …Run Code Online (Sandbox Code Playgroud)我读日语,想尝试处理一些日文文本.我尝试使用Python 3:
for i in range(1,65535):
print(chr(i), end='')
Run Code Online (Sandbox Code Playgroud)
然后Python给了我很多错误.什么地方出了错?
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Traceback (most recent call last):
File "C:\test\char.py", line 11, in <module>
print(chr(i), end='')
File "C:\Python31\lib\encodings\cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\x80' in position 0: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)
我的理解是chr函数继续将Unicode数字转换为相应的日语字符.如果是这样,为什么不输出日文字符?为什么它会在罗马字符列表的末尾崩溃?
如果我错误地认为Unicode集是为了迎合非西方语言而设计的,那么请纠正我.
编辑:
我尝试了John Machin在IDLE中提出的3行,输出工作正常!
在此之前,我一直在使用程序员的记事本,工具设置为捕获python.exe编译器的输出.也许这就是错误发生的原因.
但是,对于大多数其他事情,输出被正确捕获; 那么为什么它在这个过程中特别失败?即为什么代码在IDLE Python Shell中工作,而不是通过Programmer的Notepad输出捕获?无论接口如何,输出都不应该相同吗?
我需要搜索文本文件的目录,其中也搜索文件的内容。我目前正在使用 ripgrep 和 fzf 来执行此操作 - 问题是每个文件的每一行都会输出搜索。我需要每个搜索匹配项也指示其源文件名/文件路径。
我们有以下两个文件:
某事 某事 foo 某事
某事 某事 foo 某事
某事 某事 foo 某事
某事 某事 foo 某事
某事 某事 foo 某事
我们rg . | fzf在包含它们的目录中运行,写入 foo,并得到以下结果:
有用的示例.md:某事某事foo某事
example.md:某事某事foo某事
example.md:某事某事foo某事
example.md:某事某事foo某事
example.md:某事某事foo某事
这里的问题是 example.md 的每一行都是一个搜索结果。它应该是引用其文件的匹配项。它应该看起来像这样:
有用的示例.md:某事某事foo某事
example.md:某事某事foo某事
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………………………………………………
我的代码失败了。问题:
self.frame_for_content.pack() 在 self.scrollbar.pack(). (我无法理解为什么会这样,但滚动条仍然不起作用或遵守side打包行为。)我曾尝试将 Brian Oakley 的一些建议纳入scroll region和bbox,但无济于事。
我已将代码减少到最低限度,但无法通过。将不胜感激的帮助。
import tkinter as tk
import tkinter.ttk as ttk
class TestGUI(tk.Tk):
def __init__(self):
super().__init__()
self.canvas = tk.Canvas(self)
self.frame_for_content = tk.Frame(self.canvas)
self.canvas_frame = self.canvas.create_window((0,0), window=self.frame_for_content, anchor=tk.NW)
self.scrollbar = tk.Scrollbar(self.canvas, orient=tk.VERTICAL, command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.scrollbar.set)
self.frame_for_content.pack()
self.canvas.pack(side=tk.LEFT)
self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
for i in range(100):
tk.Label(self.frame_for_content, text="Hello World - " + str(i)).pack()
self.update()
self.canvas.config(scrollregion=self.canvas.bbox(tk.ALL))
TestGUI().mainloop()
Run Code Online (Sandbox Code Playgroud) python ×5
unicode ×2
canvas ×1
class ×1
constructor ×1
d3.js ×1
fuzzy-search ×1
fzf ×1
javascript ×1
recursion ×1
string ×1
svg ×1
tkinter ×1