Py学习  »  Python

最具python风格的方式是使用function获取用户输入

PythonNoob • 2 年前 • 1164 次点击  

我想知道用一个函数获取用户输入的最具python风格的方式是什么。

在第一个例子中,我看到了我最常看到的东西,那就是在函数之外获取输入。

#Example1
def add(num1,num2):
    return num1+num2

num1=int(input('num1: '))
num2=int(input('num2: '))
add(num1,num2)

第二个示例在调用函数时直接在括号内获取用户输入,这也很有效。

#Example2
def add(num1,num2):
    return num1+num2
add(int(input('num1: ')),int(input('num2: ')))

然而,如果我试图从函数中获取输入,我会得到一个错误。有没有办法从内部做到这一点?

#Example3
def add(num1,num2):
    num1=int(input('num1: '))
    num2=int(input('num2: '))
    return num1+num2
add(num1,num2)

哪种方式更可取?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/133126
 
1164 次点击  
文章 [ 2 ]  |  最新文章 2 年前
rzlvmp
Reply   •   1 楼
rzlvmp    2 年前

这三个例子都可以根据具体情况使用。这里没有错误的例子(除了 num1 num2 不需要作为的函数参数传递 Example3 )

我个人的看法是:

  1. 例3 这很糟糕,因为将来可能很难测试。假设你想测试一下 2 + 2 == 4 :

    def add(n1, n2):
      return n1 + n2
    
    assert 2 + 2 == add(2, 2)
    

    万一 例3 测试是不可能的 add 没有用户输入

  2. 你的函数调用了 添加 所以 添加 必须只关心添加。如果你调用你的函数 get_input_sum 然后 例3 这是最正确的

  3. 添加 名称有点宽,所以很难猜测它应该返回sum还是concat字符串?如果你叫它 sum 然后函数必须关心你在其中传递的内容:

    def sum(n1, n2):
      try:
        n1, n2 = int(n1), int(n2)
      except ValueError:
        print('Only numeric values accepted')
        raise
      return n1 + n2
    

    在这种情况下,你会确信 总和 永远都是正确的 '2' + '2' 4 但不是 '22'

    如果你投 str -> int 检查外面的类型 总和 函数您必须关心在函数编号或字符串中传递的内容。

    然而,如果 添加 更宽,你不希望看到真正的 总和 (假设你想做以下事情: [1] + [2] => [1, 2] )然后你应该检查函数之外的类型。

总之:正确答案取决于上下文

Blckknght
Reply   •   2 楼
Blckknght    2 年前

如果你被分配到 num1 num2 仅在函数中,您不再需要将它们作为参数传递。实际上,您不能将它们作为参数传递,因为函数外部的代码不知道为它们输入了什么值。这就是为什么你会得到一个例外,名字 num1 num2 它们是不受约束的。

只需删除这些参数:

def add():                    # get rid of parameters here
    num1=int(input('num1: '))
    num2=int(input('num2: '))
    return num1+num2
add()                         # and don't try to pass any arguments

至于首选的是什么,可能您希望在示例1上进行一些修改。如果希望函数收集用户输入, 让它成为一个单独的功能 .用户输入收集功能可以调用 add 函数的值,就像您的全局代码一样,不会污染全局名称空间。

def add(num1,num2):            # this is unchanged from the early examples
    return num1+num2

def do_stuff():                # put the user input in another function
    num1=int(input('num1: '))
    num2=int(input('num2: '))
    print(add(num1,num2))      # or return here, or do whatever makes sense