鱼C论坛

 找回密码
 立即注册
查看: 131|回复: 13

[已解决]新手小白在线求讲一下函数的代码块的细节

[复制链接]
发表于 前天 12:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. from xpinyin import Pinyin

  2. def get_input():
  3.     s = input("请输入一段话:")
  4.     while len(s) == 1:
  5.          s = input("字数太少,请重新输入:")
  6.     return s
  7.    
  8. def get_py(s):#为什么括号里是s?
  9.     p = Pinyin()
  10.     s = p.get_pinyin(s)#这是约定好必须统一一个名字吗?我不能写成h=p.get_pinyin(s)吗?这样好区别开一点
  11.     return s
  12.    
  13. def check_pd(s):#这里的括号里为什么也是s呢?
  14.     l = s.split("-")   
  15.     for i in range(len(l) // 2):
  16.         if(l[i] != l[-i-1]):
  17.             return False
  18.     else:
  19.         return True
  20.    
  21. s = get_input()
  22. w = get_py(s)
  23. if check_pd(w):#这里又变成w了?难道括号里数值要用上一个代码块最终得到结果的函数名吗?,还有呀,这里的if、else语句能不能弄到最后一个代码块里,统一一下呢?
  24.     print(f"[{s}]是回文。")
  25. else:
  26.     print(f"[{s}]不是回文。")
复制代码
最佳答案
前天 22:01
爱吃菠萝包 发表于 2025-5-18 21:48
意思是用户自己输入的,不需要形参,系统内部自己处理的需要形参,是这样理解吗?


总的来说,还是看具体应用场景决定函数具体该怎么编写,需不需要形参。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 前天 12:04 | 显示全部楼层
关于函数参数和代码结构的解答


  1. from xpinyin import Pinyin

  2. def get_input():
  3.     s = input("请输入一段话:")
  4.     while len(s) < 2:  # 原代码有bug,应改为<2而不是==1
  5.         s = input("字数太少,请重新输入:")
  6.     return s
复制代码


问题1:函数参数为什么用s?
函数参数是形参,可以自由命名(推荐有意义的名字)。比如可以改成:

  1. def get_py(input_str):  # 这里参数名改成了input_str
  2.     p = Pinyin()
  3.     h = p.get_pinyin(input_str)  # 完全可以改名为h
  4.     return h
复制代码


问题2:check_pd参数为什么是s?调用时传w?
这是参数传递机制:
  • 函数定义时的参数是"形参"(接收外部值的容器)
  • 调用时传递的是"实参"(实际的值)
  • 这里的w是get_py()处理后的结果,作为实参传给check_pd的形参s


问题3:if-else能否整合到函数里?
可以,但会降低函数复用性。修改后的版本:

  1. def check_pd(s):
  2.     l = s.split("-")
  3.     for i in range(len(l)//2):
  4.         if l[i] != l[-i-1]:  # 原代码这里有bug,应比较首尾元素
  5.             return False
  6.     return True  # 不需要else,直接放在循环外
复制代码


问题4:重要代码问题修正
原代码存在两个严重bug:
1. 检查长度逻辑错误(应该用len(s) < 2)
2. 回文判断逻辑错误(原代码比较的是l != l,永远返回True)

最终调用逻辑:

  1. s = get_input()
  2. py_str = get_py(s)  # 变量名建议更明确
  3. result = check_pd(py_str)  # 保存结果更清晰

  4. if result:
  5.     print("是回文。")
  6. else:
  7.     print("不是回文。")
复制代码


建议阅读顺序:
1. 理解函数参数是"传递值"而非"传递变量名"
2. 变量名只要在函数内部统一即可
3. 每个函数应该保持单一职责原则

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 12:19 | 显示全部楼层
在22行之后的 s 变量与 w 变量都是全局的变量,此处使用什么名字与函数定义无关。
22行之前定义的3个函数是分别独立的。同时,函数代表的是一个操作。如
  1. def add(a, b):
  2.     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 行的疑问,我没有读懂 :|
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 13:01 | 显示全部楼层
1. s是参数名称,和变量名一样是可以自由调整的
2. 不是,可以
3. 因为想要用来check的是“w”不是s所以得这样写;不能

求最佳
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 17:30 | 显示全部楼层
player-none 发表于 2025-5-18 13:01
1. s是参数名称,和变量名一样是可以自由调整的
2. 不是,可以
3. 因为想要用来check的是“w”不是s所以 ...

哎呀,不是这个意思,我就是想问def get_py(s)括号的s代表啥,我知道是形参,想问一点具体的实际用途,比如为啥第一个代码块def get_input()括号里没有啊?我感觉还是有一点模糊的,大佬,讲细致一点嘛
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 18:00 | 显示全部楼层
爱吃菠萝包 发表于 2025-5-18 17:30
哎呀,不是这个意思,我就是想问def get_py(s)括号的s代表啥,我知道是形参,想问一点具体的实际用途,比 ...

就是形参啊,get_input()不要形参,get_py()要一个被他叫作“s“的形参
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 21:28 From FishC Mobile | 显示全部楼层
player-none 发表于 2025-5-18 18:00
就是形参啊,get_input()不要形参,get_py()要一个被他叫作“s“的形参

啥叫不要,啥叫要,讲细点呗,我才开始学函数呢,为啥不要,是想要就要,想不要就不要嘛?要了有啥用,第一个没要也没啥影响,那第二个也可以不要嘛?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 21:29 From FishC Mobile | 显示全部楼层
tommyyu 发表于 2025-5-18 12:19
在22行之后的 s 变量与 w 变量都是全局的变量,此处使用什么名字与函数定义无关。
22行之前定义的3个函数 ...

这个用重名是不影响的是吧,各自运行各自的?还想问一下形参到底是个啥作用,为什么第一个代码块就没有?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 21:35 | 显示全部楼层
爱吃菠萝包 发表于 2025-5-18 21:29
这个用重名是不影响的是吧,各自运行各自的?还想问一下形参到底是个啥作用,为什么第一个代码块就没有?

重名不影响。
形参就相当于 加法交换律 a+b=b+a 中的 a 和 b,相当于用一个局部变量名代表输入值。第一个代码块的函数没有输入值,因而不需要形参。详见https://fishc.com.cn/thread-206415-1-5.html
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 21:38 | 显示全部楼层
爱吃菠萝包 发表于 2025-5-18 21:28
啥叫不要,啥叫要,讲细点呗,我才开始学函数呢,为啥不要,是想要就要,想不要就不要嘛?要了有啥用,第 ...

由于实现的函数功能不同,因而有没有形参根据函数而定。第一个函数的作用是输入一个字符串,不需要参数;第二个函数将一个字符串 s 的拼音返回,需要字符串 s 的输入。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 21:48 From FishC Mobile | 显示全部楼层
tommyyu 发表于 2025-5-18 21:38
由于实现的函数功能不同,因而有没有形参根据函数而定。第一个函数的作用是输入一个字符串,不需要参数; ...

意思是用户自己输入的,不需要形参,系统内部自己处理的需要形参,是这样理解吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 22:01 | 显示全部楼层
本帖最后由 tommyyu 于 2025-5-18 22:02 编辑
爱吃菠萝包 发表于 2025-5-18 21:48
意思是用户自己输入的,不需要形参,系统内部自己处理的需要形参,是这样理解吗?


并不一定如此,总的来说还得看函数的实现效果。如下面这个函数,可以指定输入次数,虽然是用户输入也需要形参。
  1. def input_many_times(times):
  2.     result = []
  3.     for i in range(times):
  4.         temp = input()
  5.         result.append(temp)
  6.     return result
复制代码
而下面这个函数因为使用了全局变量,故是系统内部处理,也不用形参。
  1. s = 'ababab'
  2. def cut_s():
  3.     for i in range(len(s)-1, 1, -1):
  4.         if len(s) % i == 0:
  5.             if int(len(s)/i)*s[:i] == s:
  6.                 return s[:i]
  7.     return ''
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 22:01 | 显示全部楼层    本楼为最佳答案   
爱吃菠萝包 发表于 2025-5-18 21:48
意思是用户自己输入的,不需要形参,系统内部自己处理的需要形参,是这样理解吗?


总的来说,还是看具体应用场景决定函数具体该怎么编写,需不需要形参。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 18:28 | 显示全部楼层
爱吃菠萝包 发表于 2025-5-18 21:28
啥叫不要,啥叫要,讲细点呗,我才开始学函数呢,为啥不要,是想要就要,想不要就不要嘛?要了有啥用,第 ...

因为get_py是根据给的s来做出反应,所以getpy要参数,没s的话getpy不知道求谁的拼音;
getinput和参数无关,他自己就能做好所有事情
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-20 14:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表