爱吃菠萝包 发表于 2025-5-18 12:03:22

新手小白在线求讲一下函数的代码块的细节

from xpinyin import Pinyin

def 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}]不是回文。")

FishC 发表于 2025-5-18 12:04:10

关于函数参数和代码结构的解答


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 小助理,如未能正确解答您的问题,请继续追问。

tommyyu 发表于 2025-5-18 12:19:35

在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 行的疑问,我没有读懂 :|

player-none 发表于 2025-5-18 13:01:51

1. s是参数名称,和变量名一样是可以自由调整的
2. 不是,可以
3. 因为想要用来check的是“w”不是s所以得这样写;不能

求最佳

爱吃菠萝包 发表于 2025-5-18 17:30:22

player-none 发表于 2025-5-18 13:01
1. s是参数名称,和变量名一样是可以自由调整的
2. 不是,可以
3. 因为想要用来check的是“w”不是s所以 ...

哎呀,不是这个意思,我就是想问def get_py(s)括号的s代表啥,我知道是形参,想问一点具体的实际用途,比如为啥第一个代码块def get_input()括号里没有啊?我感觉还是有一点模糊的,大佬,讲细致一点嘛

player-none 发表于 2025-5-18 18:00:46

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

就是形参啊,get_input()不要形参,get_py()要一个被他叫作“s“的形参

爱吃菠萝包 发表于 2025-5-18 21:28:05

player-none 发表于 2025-5-18 18:00
就是形参啊,get_input()不要形参,get_py()要一个被他叫作“s“的形参

啥叫不要,啥叫要,讲细点呗,我才开始学函数呢,为啥不要,是想要就要,想不要就不要嘛?要了有啥用,第一个没要也没啥影响,那第二个也可以不要嘛?

爱吃菠萝包 发表于 2025-5-18 21:29:59

tommyyu 发表于 2025-5-18 12:19
在22行之后的 s 变量与 w 变量都是全局的变量,此处使用什么名字与函数定义无关。
22行之前定义的3个函数 ...

这个用重名是不影响的是吧,各自运行各自的?还想问一下形参到底是个啥作用,为什么第一个代码块就没有?

tommyyu 发表于 2025-5-18 21:35:13

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

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

tommyyu 发表于 2025-5-18 21:38:20

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

由于实现的函数功能不同,因而有没有形参根据函数而定。第一个函数的作用是输入一个字符串,不需要参数;第二个函数将一个字符串 s 的拼音返回,需要字符串 s 的输入。

爱吃菠萝包 发表于 2025-5-18 21:48:27

tommyyu 发表于 2025-5-18 21:38
由于实现的函数功能不同,因而有没有形参根据函数而定。第一个函数的作用是输入一个字符串,不需要参数; ...

意思是用户自己输入的,不需要形参,系统内部自己处理的需要形参,是这样理解吗?

tommyyu 发表于 2025-5-18 22:01:11

本帖最后由 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 ''

tommyyu 发表于 2025-5-18 22:01:48

爱吃菠萝包 发表于 2025-5-18 21:48
意思是用户自己输入的,不需要形参,系统内部自己处理的需要形参,是这样理解吗?

总的来说,还是看具体应用场景决定函数具体该怎么编写,需不需要形参。

player-none 发表于 2025-5-19 18:28:38

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

因为get_py是根据给的s来做出反应,所以getpy要参数,没s的话getpy不知道求谁的拼音;
getinput和参数无关,他自己就能做好所有事情
页: [1]
查看完整版本: 新手小白在线求讲一下函数的代码块的细节