You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中函数间传递变量/字符串的最优方式探讨

多函数通信的代码结构选择困惑

先给出基础数据:

fruits = "banana", "apple", "orange"
vegetable = "cucumber", "pepper", "onion"
first_name = "John"

第一种方案:单函数包揽多任务

将所有变量传入一个函数,由该函数完成拼接全名、打印喜好、打印厌恶项三项任务。虽然能实现功能,但代码规模扩大后会难以维护,不利于任务拆分。

def preferences(first_name, last_name, what_he_likes, what_he_hates):
    full_name = first_name + " " + last_name
    
    for item in what_he_likes:
        print(full_name + " likes " + item)
        
    for item in what_he_hates:
        print(full_name + " hates " + item)
    
preferences(first_name, "Lambert", fruits, vegetable)

第二种方案:拆分职责明确的小函数

拆分出三个各有单一职责的函数:拼接全名、打印喜好、打印厌恶项。结构更清晰,但每次调用都需要传递名称变量,代码规模扩大后可能每个函数都要传入3-4个变量,显得繁琐。

def add_last_name(first_name, last_name):
    full_name = first_name + " " + last_name
    return full_name

def likes(name, what_he_likes):
    for item in what_he_likes:
        print(name + " likes " + item)

def hates(name, what_he_hates):
    for item in what_he_hates:
        print(name + " hates " + item)


full_name = add_last_name(first_name, "Lambert")
likes(full_name, fruits)
hates(full_name, vegetable)

第三种方案:硬编码固定值的单函数

将逻辑放在一个函数中,直接写入固定字符串而非传递变量。避免了变量传递的麻烦,但硬编码的方式后续修改时需要大量查找代码,维护性极差。

def preferences_direct_name(what_he_likes, what_he_hates):
    for item in what_he_likes:
        print("John Lambert" + " likes " + item)
        
    for item in what_he_hates:
        print("John Lambert" + " hates " + item)
    
preferences_direct_name(fruits, vegetable)

我的疑问

我想了解大家偏好的代码结构:有时我仅需将一个变量传递给另一个函数一次,纠结是直接硬编码字符串以避免变量传递的繁琐,还是不使用单一大函数以保证代码清晰度,希望得到专业建议。


专业建议

  1. 绝对避免硬编码(第三种方案):硬编码会让代码彻底失去灵活性,哪怕当前只需要一次调用,后续需求变更(比如支持多用户、修改名字)时,必须全局搜索修改,极易出错,维护成本极高,完全不符合可维护性原则。

  2. 优先选择职责拆分的方案(第二种方案),并优化变量传递问题:

    • 当多个函数需要共享同一组上下文数据(比如用户的全名、个人信息)时,用类封装数据和相关行为是最优解,避免重复传递参数:
      class UserPreferences:
          def __init__(self, first_name, last_name):
              self.full_name = f"{first_name} {last_name}"
          
          def print_likes(self, items):
              for item in items:
                  print(f"{self.full_name} likes {item}")
          
          def print_hates(self, items):
              for item in items:
                  print(f"{self.full_name} hates {item}")
      
      # 使用方式
      user = UserPreferences(first_name, "Lambert")
      user.print_likes(fruits)
      user.print_hates(vegetable)
      
    • 如果不想用类,也可以把共享数据打包成数据类或字典,一次性传递给函数,减少参数数量:
      from dataclasses import dataclass
      
      @dataclass
      class User:
          first_name: str
          last_name: str
          
          @property
          def full_name(self):
              return f"{self.first_name} {self.last_name}"
      
      def print_likes(user: User, items):
          for item in items:
              print(f"{user.full_name} likes {item}")
      
      def print_hates(user: User, items):
          for item in items:
              print(f"{user.full_name} hates {item}")
      
      # 使用方式
      user = User(first_name, "Lambert")
      print_likes(user, fruits)
      print_hates(user, vegetable)
      
  3. 单大函数(第一种方案)仅适用于极小规模的一次性代码:如果代码永远不会扩展,只是临时快速实现需求,单函数可以用,但只要有后续维护或扩展的可能,就必须拆分职责。

总结:代码的可维护性和清晰度永远优先于一时的“少写几行代码”,硬编码是绝对的禁忌;拆分职责后遇到的参数传递问题,通过封装(类、数据类)就能优雅解决。

内容的提问来源于stack exchange,提问作者Petar Pehchevski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:32:54