新手小白在线求讲一下函数的代码块的细节
from xpinyin import Pinyindef get_input():
s = input("请输入一段话:")
while len(s) == 1:
s = input("字数太少,请重新输入:")
return s
def get_py(s):#为什么括号里是s?
p = Pinyin()
s = p.get_pinyin(s)#这是约定好必须统一一个名字吗?我不能写成h=p.get_pinyin(s)吗?这样好区别开一点
return s
def check_pd(s):#这里的括号里为什么也是s呢?
l = s.split("-")
for i in range(len(l) // 2):
if(l != l[-i-1]):
return False
else:
return True
s = get_input()
w = get_py(s)
if check_pd(w):#这里又变成w了?难道括号里数值要用上一个代码块最终得到结果的函数名吗?,还有呀,这里的if、else语句能不能弄到最后一个代码块里,统一一下呢?
print(f"[{s}]是回文。")
else:
print(f"[{s}]不是回文。") 关于函数参数和代码结构的解答
from xpinyin import Pinyin
def get_input():
s = input("请输入一段话:")
while len(s) < 2:# 原代码有bug,应改为<2而不是==1
s = input("字数太少,请重新输入:")
return s
问题1:函数参数为什么用s?
函数参数是形参,可以自由命名(推荐有意义的名字)。比如可以改成:
def get_py(input_str):# 这里参数名改成了input_str
p = Pinyin()
h = p.get_pinyin(input_str)# 完全可以改名为h
return h
问题2:check_pd参数为什么是s?调用时传w?
这是参数传递机制:
[*]函数定义时的参数是"形参"(接收外部值的容器)
[*]调用时传递的是"实参"(实际的值)
[*]这里的w是get_py()处理后的结果,作为实参传给check_pd的形参s
问题3:if-else能否整合到函数里?
可以,但会降低函数复用性。修改后的版本:
def check_pd(s):
l = s.split("-")
for i in range(len(l)//2):
if l != l[-i-1]:# 原代码这里有bug,应比较首尾元素
return False
return True# 不需要else,直接放在循环外
问题4:重要代码问题修正
原代码存在两个严重bug:
1. 检查长度逻辑错误(应该用len(s) < 2)
2. 回文判断逻辑错误(原代码比较的是l != l,永远返回True)
最终调用逻辑:
s = get_input()
py_str = get_py(s)# 变量名建议更明确
result = check_pd(py_str)# 保存结果更清晰
if result:
print("是回文。")
else:
print("不是回文。")
建议阅读顺序:
1. 理解函数参数是"传递值"而非"传递变量名"
2. 变量名只要在函数内部统一即可
3. 每个函数应该保持单一职责原则
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 在22行之后的 s 变量与 w 变量都是全局的变量,此处使用什么名字与函数定义无关。
22行之前定义的3个函数是分别独立的。同时,函数代表的是一个操作。如def add(a, b):
return a+b中定义了一个加法函数,此处的 a 和 b 如同数学公式中的 a+b = b+a 一样,旨在说明函数在接收到一个值之后会进行什么操作。对于第 09 行和第 14 行的疑问,这两个函数中形参同样是 s 是人为设置的,想设置其他变量名也可以。恰如 ab=ba 和 a+b=b+a 中虽然都用了 a 和 b 两个字母,确没有什么联系;同时, a和b 也可以换成 x y 等字母。
对于第 11 行的疑问,此处的确可以写成 h=p.get_pinyin(s),这也是一种更好,更有区分度的写法。
对于第 22 行的疑问,我没有读懂 :| 1. s是参数名称,和变量名一样是可以自由调整的
2. 不是,可以
3. 因为想要用来check的是“w”不是s所以得这样写;不能
求最佳 player-none 发表于 2025-5-18 13:01
1. s是参数名称,和变量名一样是可以自由调整的
2. 不是,可以
3. 因为想要用来check的是“w”不是s所以 ...
哎呀,不是这个意思,我就是想问def get_py(s)括号的s代表啥,我知道是形参,想问一点具体的实际用途,比如为啥第一个代码块def get_input()括号里没有啊?我感觉还是有一点模糊的,大佬,讲细致一点嘛 爱吃菠萝包 发表于 2025-5-18 17:30
哎呀,不是这个意思,我就是想问def get_py(s)括号的s代表啥,我知道是形参,想问一点具体的实际用途,比 ...
就是形参啊,get_input()不要形参,get_py()要一个被他叫作“s“的形参 player-none 发表于 2025-5-18 18:00
就是形参啊,get_input()不要形参,get_py()要一个被他叫作“s“的形参
啥叫不要,啥叫要,讲细点呗,我才开始学函数呢,为啥不要,是想要就要,想不要就不要嘛?要了有啥用,第一个没要也没啥影响,那第二个也可以不要嘛? tommyyu 发表于 2025-5-18 12:19
在22行之后的 s 变量与 w 变量都是全局的变量,此处使用什么名字与函数定义无关。
22行之前定义的3个函数 ...
这个用重名是不影响的是吧,各自运行各自的?还想问一下形参到底是个啥作用,为什么第一个代码块就没有? 爱吃菠萝包 发表于 2025-5-18 21:29
这个用重名是不影响的是吧,各自运行各自的?还想问一下形参到底是个啥作用,为什么第一个代码块就没有?
重名不影响。
形参就相当于 加法交换律 a+b=b+a 中的 a 和 b,相当于用一个局部变量名代表输入值。第一个代码块的函数没有输入值,因而不需要形参。详见https://fishc.com.cn/thread-206415-1-5.html 爱吃菠萝包 发表于 2025-5-18 21:28
啥叫不要,啥叫要,讲细点呗,我才开始学函数呢,为啥不要,是想要就要,想不要就不要嘛?要了有啥用,第 ...
由于实现的函数功能不同,因而有没有形参根据函数而定。第一个函数的作用是输入一个字符串,不需要参数;第二个函数将一个字符串 s 的拼音返回,需要字符串 s 的输入。 tommyyu 发表于 2025-5-18 21:38
由于实现的函数功能不同,因而有没有形参根据函数而定。第一个函数的作用是输入一个字符串,不需要参数; ...
意思是用户自己输入的,不需要形参,系统内部自己处理的需要形参,是这样理解吗? 本帖最后由 tommyyu 于 2025-5-18 22:02 编辑
爱吃菠萝包 发表于 2025-5-18 21:48
意思是用户自己输入的,不需要形参,系统内部自己处理的需要形参,是这样理解吗?
并不一定如此,总的来说还得看函数的实现效果。如下面这个函数,可以指定输入次数,虽然是用户输入也需要形参。def input_many_times(times):
result = []
for i in range(times):
temp = input()
result.append(temp)
return result而下面这个函数因为使用了全局变量,故是系统内部处理,也不用形参。s = 'ababab'
def cut_s():
for i in range(len(s)-1, 1, -1):
if len(s) % i == 0:
if int(len(s)/i)*s[:i] == s:
return s[:i]
return '' 爱吃菠萝包 发表于 2025-5-18 21:48
意思是用户自己输入的,不需要形参,系统内部自己处理的需要形参,是这样理解吗?
总的来说,还是看具体应用场景决定函数具体该怎么编写,需不需要形参。 爱吃菠萝包 发表于 2025-5-18 21:28
啥叫不要,啥叫要,讲细点呗,我才开始学函数呢,为啥不要,是想要就要,想不要就不要嘛?要了有啥用,第 ...
因为get_py是根据给的s来做出反应,所以getpy要参数,没s的话getpy不知道求谁的拼音;
getinput和参数无关,他自己就能做好所有事情
页:
[1]