【问题标题】:Why does my program run without parameters inside the functions' parenthesis?为什么我的程序在函数括号内没有参数运行?
【发布时间】:2021-05-04 05:05:37
【问题描述】:

我可能会问一个非常愚蠢的问题。我设计了如下代码:

import pandas as pd 
import seaborn as sns
import matplotlib.pyplot as plt

def menu():
   print("[1]: Favorite color") 
   print("[2]: Number of cats")

#Option1
def FavColor():
   sns.countplot(x= "Color", data = main_data)
   plt.show()

#Option2
def NumCats():
   sns.countplot(x= "Cats", data = main_data)
   plt.show()

#Main Code

try:
   main_data = pd.read_csv("DATAFIN.csv")
except IOError:
   print("Error while trying to open the file")
else:
   menu()
   option = int(raw_input())
   if option == 1:
         FavColor()
   elif option == 2:
         NumCats()

main_data 如下所示:

    Color   Cats
1    Blue      1
2    Yellow    2
3    Blue      2
4    Red       1
5    Blue      3

现在,“问题”是我的程序完全按照它应该运行的方式运行。然而,我刚刚意识到,我的所有函数 options()、Option1() 和 Option2() 在括号内都没有参数。这是因为我忘记了这样做,但我的理解是,如果没有我给它们提供需要使用的参数,我的函数就不应该工作。

例如,如果 Option1 必须使用精确的数据帧,我应该编写 Option1(dataframe)。

我的函数需要你的一切都在主代码中定义,你在调用函数之前要经过这些,所以也许这就是原因。但是不把参数放在里面有错吗?它会降低我的程序效率吗?

【问题讨论】:

  • 首先,python2 是生命的尽头,你不应该使用它。其次,如果您使用的是未定义的变量,Python 会这样抱怨,因此您需要显示实际代码的minimal reproducible example
  • @OneCricketeer 对不起!我刚刚完成了我的编辑。非常感谢您的反馈。我知道 python2 是一个错误,但我被告知要使用它,因为班上的其他人都在使用它。我会尽快升级
  • 那么,当您说“按应有的方式运行”时,您是否能够很好地获得 seaborn 情节?您是否在可能已经存在对 main_data 的引用的 Jupyter 笔记本环境中运行此代码?你的老师应该知道 Python3 已经面世十多年了
  • @OneCricketeer 是的,我得到的情节很好,我相信它们也是正确的。我在 Visual Studio Code 中运行它,但在运行代码之前未定义 main_data。在我的 .py 代码以外的环境中,我只有 DATAFIN.csv 文件。

标签: python function parameters


【解决方案1】:

空括号表示它没有参数。

定义新函数不会使函数运行。

【讨论】:

  • 谢谢!但我还是不明白。我的程序没有任何问题,就像我将参数放在括号内一样。这怎么可能?这里我写了我的代码的简化版本,但实际上每个函数大约 5-10 行长并且它们都可以工作。
  • @mcnew 然后您需要发布您正在使用的确切代码。您发布的代码肯定行不通,因为它试图使用不存在的变量。
【解决方案2】:

你只是碰巧引用了一个全局变量

这是一个更简单的例子

def foo():
    print(x) 
    
x = 2
foo() 

x 可以在函数之前或之后定义;函数定义捕获变量引用的闭包,而不是变量本身

另一方面,如果你用局部变量定义了一个主函数,它就不起作用了

def foo():
    print(x) 
    
def main():
    x = 2
    foo() 

main()

一般来说,应该避免使用全局变量,因此应该使用参数,参数只是引用,分配给函数参数的内存空间开销可以忽略不计

【讨论】:

  • 非常感谢!这意味着,如果出于任何原因,我的主代码是一个函数,则整个程序都不会运行。这是正确的吗?再次感谢您的帮助。
  • 您仍然可以在主函数之外读取文件,但问题在于变量范围比什么都重要
  • 知道了。再次感谢你:)
猜你喜欢
  • 1970-01-01
  • 2015-10-03
  • 2014-07-03
  • 1970-01-01
  • 2019-08-10
  • 2013-08-22
  • 1970-01-01
  • 2017-11-07
相关资源
最近更新 更多