创建一个带四个参数的函数。

15

好的,我正在做一个作业任务,被要求完成以下内容:

创建一个名为“学生数据”的函数,它接受四个参数,姓名(字符串),年龄(整数),学号(字符串)和是否注册CSCA08(布尔值),并以以下格式返回包含该信息的字符串:[学号,姓名,年龄,是否注册]。

您的代码应按以下方式工作:

>>> student_data("Brian",32,"1234567",False)
`[1234567,Brian,32,False]'
>>> student_data("Nick",97,"0000001",True)
`[0000001,Nick,97,True]'

我想到的是这个:

def student_data(name, age, student_number):
    return  '[' + student_number + ',' + name + ',' + str(age) + ']'

并在输入到Python时:

student_data("Jeremy", 19, "999923329")
'[999923329,Jeremy,19]'

(注意,我省略了关于布尔值的最后一部分 - 我马上会讲到。)

据我所知,'Jeremy'和'999923329'都是字符串,随后作为第二行字符串的一部分返回。对于'age',由于在调用student_data函数时没有引号,因此Python将其解释为一个整数。然后,我将该整数值转换为字符串,以便最终得到'[999923329,Jeremy,19]'。

因此,从技术上讲,我想问的是:直到返回函数将其更改为str类型,参数'age'是否被Python视为int类型?请注意,该任务需要四个参数,两个字符串(我有),一个整数(我不知道它实际上是否被解释为整数)和一个布尔值,因此如下:

我真的不知道布尔值是如何工作的。具体而言,在任务的上下文中,我应该做什么?举个例子,会是什么样子?我把我的代码拼凑了一会儿,得出了以下内容:

def student_data(name, age, student_number, boolean):
    return  '[' + student_number + ',' + name + ',' + str(age) + "," + str(boolean) + ']'

然后在Python中输入它:

student_data("Jeremy", 19, "999923329", True)
'[999923329,Jeremy,19,True]'

这实际上正是作业要求我的,但我不喜欢这样做,因为我并不真正理解正在发生的事情。例如,“boolean”是函数“student_data”需要使用的一个参数。但是参数到底是什么?它和变量是一样的吗?当我在Python shell中输入“True”时,到底发生了什么?

所发生的事情和给变量赋值时发生的事情一样吗?在那种情况下,当我给一个变量赋值时会发生什么?作业要求将参数设置为布尔值,但我不认为我已经在代码中输入了布尔值,是吗?

如果还没有显而易见,我以前从未上过计算机科学课。


一个建议:def student_data(name, age, student_number): return '[{}, {}, {}]'.format(name, age, student_number)。最好使用str.format而不是用+连接字符串。 - rlms
2
Python不会将数据视为某种类型 - 更改类型意味着使用另一个对象构造新对象。因此,Python知道要从整数创建字符串,需要按正确顺序使用正确的数字。这不是仅仅将其标记为字符串的过程。str()使用给定值作为基础创建一个新值。看起来你对语言的基础知识理解不够好 - 你应该阅读更多的教程。 - Gareth Latty
@user2387370,您可能正在参考非常相似的问题:http://stackoverflow.com/questions/18857723/putting-biographical-data-in-order-from-4-parameters-using-python-3-3 http://stackoverflow.com/questions/18854561/create-a-function-with-4-parameters-using-python-3-3 然而,这个问题有一些更具体的问题,所以我不会将其称为重复问题。 - zch
请参考这篇文章。它对你会很有帮助。 http://codewithlogic.wordpress.com/2013/09/01/python-basics-understanding-the-variables/ - Arpit
4个回答

8
在Python中,有对象名称。一个对象有一个类型,而名称只是指向对象的指针。如果一个对象没有名称,你就不能访问它(事实上,如果没有名称指向一个对象,Python会完全摆脱它)。
在其他语言中,名称通常称为变量,并且声明为特定类型。我读过一些关于变量被称为盒子的书,这个盒子只能装特定类型的东西,也就是值。
Python的工作方式有点不同。相当于变量的名称没有类型。它们可以指向任何对象,更具体地说,任何类型的对象
引用如下:
所以从技术上讲,我想问的是:参数“age”是否被Python视为int,直到返回函数将其转换为str类型?请注意,该赋值要求4个参数,2个字符串(我已经有了),1个int(我不知道它是否被解释为int)和一个布尔值。
由于Python对类型不严格,通常会提到对象。因此,当您将17作为参数传递给函数时,您正在传递整数类型的对象17
但是,age只是一个名称,名称可以指向任何类型。由于您可以将任何对象传递给函数(换句话说,age可以是任何有效的Python对象),因此不正确地说参数“age”被视为int。它只是一个占位符,用于传递给函数的任何类型的对象。
在函数体中,您正在通过组合其他对象创建一个字符串对象。
当您要求一个字符串对象与另一个对象 - 任何其他对象结合时,字符串对象知道该怎么做。由于它不知道您将尝试与其结合什么;它有一些合理的默认值,并尝试将东西转换为字符串。
如果它无法进行此组合,则会给出错误:
>>> 'a' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

在这种情况下,我们想要做的是将对象2转换为字符串。为了做到这一点,对于整数或者任何其他对象,我们使用str()方法(就像你已经正确地做了)。
当你将对象转换为字符串时,会创建一个全新的对象-它与原始对象没有联系,并且是其字符串表示形式。这是一个全新的对象。完全不同的东西。

我真的不知道布尔值是如何工作的。特别是在这个任务的上下文中,我应该做什么?

好消息是,一旦你知道一个对象的工作原理,所有对象通常都遵循相同的方式。在Python中,当你知道如何获取一个对象的字符串版本(通过执行str()),你可以在每个其他对象上使用相同的技术。这取决于对象来确定如何“转换”自己。
换句话说,由于你知道str()将采取一个对象并将其转换为其字符串表示形式;你可以放心它将与Python中的每个其他对象一起使用。
由于Python中的类型不是严格的,因此它给程序员提供了这种灵活性,使他们能够依赖对象知道需要做什么。
这就是为什么str()适用于布尔值、整数和浮点数以及每个其他对象的原因。在你学习类(创建自定义对象的方法)时,你将学习如何控制当有人对其执行str()时会发生什么。

6

在Python中,变量是指向对象的标签。代码x = 7将标签x放置在内存中表示数字7的对象上。这有点像所有变量都是指针。这意味着您可以使用标签x代替数字7:

>>> y = x + 8
>>> print(y)
15
>>> x = "hello world!"
>>> print(x)
hello world!

函数有点像数学中的函数,它接受一些输入并返回一个输出。

例如:

def f(x, y, z):
    return x + y * z

在这个例子中,xyz 是参数。然后我可以这样调用函数:
>>> print(f(1, 2, 3))
6

在这个例子中,1、2和3是参数。
参数是函数定义内部的变量:
def f(x):
    print(x)
    return x + 7

>>> variable = f(5)
5
>>> print(variable)
12
>>> print(x)
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    print(x)
NameError: name 'x' is not defined

在函数外部,x未被定义。这种变量仅在特定位置可访问的概念称为变量作用域。

在您的函数中,参数age应该给一个类型为int的参数。调用时,它返回指向变量age的对象,转换为字符串。这并不改变该对象。

您在调用函数时输入了一个布尔值作为参数:

student_data("Jeremy", 19, "999923329", True)
                                          ^
                                     There is the Boolean!

Python没有严格的类型系统(它使用鸭子类型),因此您不必(实际上也无法)指定函数参数的类型。因此,您实际上可以使用字符串、整数或您定义的类的实例作为布尔参数调用函数。


1
“变量”在Python中是指一个标签,用于指向包含某些内容的内存地址。但实际上,它更像是一个对象的标签,而不是内存地址的标签。这两者之间有很大的区别,最重要的一点是你不能进行指针算术运算。虽然该对象在某处可能会在内存中存储一些东西,但在Python中这几乎是无关紧要的。 - Lennart Regebro

2
Python具有无类型参数。您可以传递任何具有__str__方法的对象(字符串返回它们自己,整数返回它们自己的字符串表示形式...所有内置类型都是如此,据我所知),并且您的函数将起作用。
通过使用Python,您的教授要求您“创建一个带有四个任意位置参数的函数,并返回这些对象的字符串表示形式,但顺序不同”。

0
Python中,我们没有任何类型的变量,更不用说数据类型了。在Python中,通过变量我们指的是一个指向特定值的名称。
例如:
my_var=4

my_var 是一个名称,它指代数字 4。在上面的语句中它是 int 类型,但在下一行可能会有所不同。

my_var="hello"

这是一个字符串。现在没有任何人引用数字4。"hello"是my_var所引用的值。

在此之后,您可以轻松推断出对于Python来说数据类型并不重要,只要您对所引用的值进行正确的操作即可。这一切都与值有关,而不是名称。

针对您的问题,

>>> student_data("Brian",32,"1234567",False)
[1234567,Brian,32,False]

考虑一下这个问题:
def student_data(name,age student_no):
    age = age + 4       # Valid if the age is referring to number but invalid if age is string.
    age = str(age)      # If you want your number to be string then use str() function.
    age = age + "test"  # It is valid because age is referring to string now.
    return "your string"

还可以查看这个演示:http://ideone.com/pYSl3l

文章Python基础:理解变量以图像方式解释了相同的内容。


@BurhanKhalid,我所说的值是指对象。 - Arpit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接