我一直在学习Python(作为我的第一语言)来自"如何像计算机科学家一样思考:用Python学习" 。这本开放的书主要通过实例教授,我更喜欢阅读目标并自己构建程序,而不是实际阅读书中提供的程序代码。
但是,我正在努力创建一个函数,该函数将搜索给定字符串中的特定字符并返回该字符的计数次数。
我写的代码是:
def find(s, x): #find s in x
s = raw_input("Enter what you wish to find: ")
x = raw_input("Where to search? ")
count = 0
for l in x: #loop through every letter in x
if l == s:
count += 1
else:
print count
然而,当我运行此代码时,我收到错误" name' s'未定义"。
本书中的代码目标略有不同:它在字符串中搜索特定字符,但不是计算字符被找到的次数,而是返回字符串中字符的位置。
def find(strng, ch, start=0, step=1):
index = start
while 0 <= index < len(strng):
if strng[index] == ch:
return index
index += step
return -1
实际上,我并不是真的理解这段代码。
但是,即使我运行代码,例如,在'a'
中搜索'banana'
,我也会收到错误name 'banana' is not defined
。
我的代码出了什么问题?可以请有人解释我这本书中提供的代码是如何工作的吗?
答案 0 :(得分:0)
您似乎正在接受输入s和x两次 - 一次通过函数参数,一次通过原始输入。修改函数以执行任一操作(仅从原始输入 - 请参见下文)。此外,您只需要打印一次计数,因此您可以将print语句放在函数中最外层的缩进级别。
def find(): #find s in x
s = raw_input("Enter what you wish to find: ")
x = raw_input("Where to search? ")
count = 0
for l in x: #loop through every letter in x
if l == s:
count += 1
print count
答案 1 :(得分:0)
试试这个。我从你的函数中取出了参数,将print命令从else块中移出了for循环,然后写了最后一行来调用函数。
def find(): #find s in x
s = raw_input("Enter what you wish to find: ")
x = raw_input("Where to search? ")
count = 0
for l in x: #loop through every letter in x
if l == s:
count += 1
print count
find()
答案 2 :(得分:0)
1:此代码存在一些问题。该函数接受两个参数s
和x
,然后通过用户输入覆盖这些变量立即抛弃它们。在for循环中,每次遇到不是s
的字符时,都会打印计数。您应该尝试将代码中的不同想法分成不同的方法,以便您可以更轻松地重用代码。
将您的代码细分为简单的小想法。如果find的目的是计算字符串中字符的实例,则它也不应该处理用户交互。如果取出raw_input并打印,则可以将此功能简化为:
def find(s, x): #find s in x
count = 0
for l in x: #loop through every letter in x
if l == s:
count += 1
return count
现在它只需要一个字符和一个字符串,然后返回字符在字符串中出现的次数。
现在,您可以在功能
之外进行用户交互char = raw_input("Enter what you wish to find: ")
string = raw_input("Where to search?: )
print char + " appears " + `find(char, string)` + " times in " + string
2:此功能的目标是找到从具有指定步骤的起始位置遍历字符ch
时找到strng
的第一个位置。它需要ch
,strng
,一个开始搜索的位置和一个步长。如果开始为0且步长为1,则它将检查每个字符。如果开始是2,它将检查除前2个字符以外的所有字符,如果步骤为2,则将检查每个其他字符等。这通过开始查看起始索引(index = start
),然后循环而工作。 index至少为0且小于字符串的长度。由于python是0索引的,因此字符串中的最后一个字符的索引比字符串的长度小1,因此这只会限制您尝试检查无效索引。对于循环的每次迭代,代码检查当前索引处的字符是否为ch
,在这种情况下它返回索引(这是它第一次找到该字符)。每当它在当前索引处找不到该字符时,它会按步骤递增索引并再次尝试,直到它超过最后一个字符。当发生这种情况时,它退出循环并返回-1,这是一个sentinel值,表示我们没有在字符串中找到该字符。
def find(strng, ch, start=0, step=1):
index = start
while 0 <= index < len(strng):
if strng[index] == ch:
return index
index += step
return -1
3:我猜你传了一些无效的参数。 strng
应为字符串,ch
应为单个字符,start
和step
应为整数。