python学习笔记(十)函数深入(2)
1、返回值初见
如果曾经接触过C++,就会知道除了void无返回值函数(仅仅执行操作),许多函还可以处理一些数据,并返回一个或一组值(通常使用return语句将值返回到主程序的函数调用行)。
2、返回单一值
直接看例子:
def get_full_name(first_name, last_name, middle_name = ''): #我们在自定义函数时必须考虑多种情况,利用缺省值使得函数更加智能,能够面对多种情况
if middle_name: #若中间名非空
full_name = first_name + ' ' + middle_name + ' ' + last_name
else:
full_name = first_name + ' ' + last_name
return full_name #仅返回一个单一变量
full_name_0 = get_full_name('1', '2', '3')
print(full_name_0)
full_name_1 = get_full_name('4', '5')
print(full_name_1)
运行结果为:
1 3 2
4 5
例子中我引入了可选实参这一概念,本质上就是在定义函数形参的时候为其赋上缺省值,那么我们在传入实参的时候就有了选择的余地,这样做可以使得函数的功能更强(因为它能处理的情况更多了)。
3、返回多个值
返回多个值并不是说可以在函数里包含多个return语句,这是禁止的。但是,由于函数可以返回任何类型的值,其中就包括了列表和字典等比较复杂的数据结构,这里相信大家已经明白了如何返回多个值。
由于字典和列表的结构本质上是类似的,这里以字典为例。
def get_info(name, age, favorite_language):
person = {}
person['name'] = name
person['age'] = age
person['favorite_language'] = favorite_language
return person
person_0 = get_info('Mike', '18', 'python')
for key, value in person_0.items():
print(key + " : " + value)
运行结果为:
name : Mike
age : 18
favorite_language : python
4、函数与列表
上面说到函数可以返回任何类型的值,实际上,也可以传递任何类型的值。这里讲一讲函数与列表。
通常我们会先把列表传递给函数,这样可以使得程序效率更高,因为有时候我们需要对许多值执行相同的操作,此时我们可以将操作凝练成函数体,再把值加进列表作为实参,这样可以高效的处理大量的数据(这里注意,函数中对列表做的任何修改都是永久性的)。下面举个例子分析优点。
我们先看一个不是函数的例子:
languages_to_learn = ['python', 'c', 'java', 'ruby']
languages_learned = []
while languages_to_learn:
language_learning = languages_to_learn.pop()
print("I am learning " + language_learning + ".")
languages_learned.append(language_learning)
print("\nThe following languages have been learned:")
for language in languages_learned:
print(language)
运行结果为:
I am learning ruby.
I am learning java.
I am learning c.
I am learning python.
The following languages have been learned:
ruby
java
c
python
不着急分析,我们看下一个例子:
def learn_languages(languages_to_learn, languages_learned):
while languages_to_learn:
language_learning = languages_to_learn.pop()
print("I am learning " + language_learning + ".")
languages_learned.append(language_learning)
def show_languages_learned(languages_learned):
print("\nThe following languages have been learned:")
for language in languages_learned:
print(language)
languages_to_learn = ['python', 'c', 'java', 'ruby']
languages_learned = []
learn_languages(languages_to_learn, languages_learned)
show_languages_learned(languages_learned)
运行结果为:
I am learning ruby.
I am learning java.
I am learning c.
I am learning python.
The following languages have been learned:
ruby
java
c
python
这里两个例子的运行结果是一样的,但是比起第一个例子,第二个例子的程序更容易扩展和维护,我们可以因为它把第一个例子给划分成了几块,这样做不仅使程序更易于理解,而且方便在不同的地方执行操作。
上面提到,函数中对列表做的任何修改都是永久性的。但有时候,我们需要禁止函数修改列表。这里的做法我曾经提过——传入复制列表,看例子:
原本:
def learn_languages(languages_to_learn, languages_learned):
while languages_to_learn:
language_learning = languages_to_learn.pop()
print("I am learning " + language_learning + ".")
languages_learned.append(language_learning)
def show_languages_learned(languages_learned):
print("\nThe following languages have been learned:")
for language in languages_learned:
print(language)
languages_to_learn = ['python', 'c', 'java', 'ruby']
languages_learned = []
print(languages_to_learn)
learn_languages(languages_to_learn, languages_learned)
print(languages_to_learn)
运行结果为:
['python', 'c', 'java', 'ruby']
I am learning ruby.
I am learning java.
I am learning c.
I am learning python.
[]
当传入复制列表后:
def learn_languages(languages_to_learn, languages_learned):
while languages_to_learn:
language_learning = languages_to_learn.pop()
print("I am learning " + language_learning + ".")
languages_learned.append(language_learning)
def show_languages_learned(languages_learned):
print("\nThe following languages have been learned:")
for language in languages_learned:
print(language)
languages_to_learn = ['python', 'c', 'java', 'ruby']
languages_learned = []
print(languages_to_learn)
learn_languages(languages_to_learn[:], languages_learned)
print(languages_to_learn)
运行结果为:
['python', 'c', 'java', 'ruby']
I am learning ruby.
I am learning java.
I am learning c.
I am learning python.
['python', 'c', 'java', 'ruby']
函数效果不变,原列表也未被修改,具体传入列表还是复制列表依据要求而定。
来源:CSDN
作者:ackindman
链接:https://blog.csdn.net/weixin_44650011/article/details/104133442