本文标题:函数

本文链接:http://7r4ck3r.top/index.php/archives/9/

除非另有说明,本作品遵循CC 4.0 BY-SA 版权协议

声明:转载请注明文章来源。

接下来看函数,学习内容是作者学习参考蓝桥云课。csdn,python从入门到实践

定义函数

用到 def 函数名(参数)
例如

def greet_user():
    print("Hello!")

greet_user()

输出则为Hello!
分析一下这段代码 用def定义了一个名为 greet_user的函数,并在函数体内打印Hello!,greet_user()只做一件事打印Hello!,如何调用函数,如最后一行的greet_user(),就可以调用了

实参和形参(引用python从入门到实践这本书)

前面定义函数greet_user()时,要求给变量username指定一个值。调用这个函数并提供这种
信息(人名)时,它将打印相应的问候语。
在函数greet_user()的定义中,变量username是一个形参——函数完成其工作所需的一项信
息。在代码greet_user('jesse')中,值'jesse'是一个实参。实参是调用函数时传递给函数的信
息。我们调用函数时,将要让函数使用的信息放在括号内。在greet_user('jesse')中,将实参
'jesse'传递给了函数greet_user(),这个值被存储在形参username中。

传递实参

位置实参

举个例子

def make_shirt(size_s, words_w):
    print("\nThe size is " +size_s + " and the words is " +words_w)
make_shirt( "xl" , "i'm a hacker")


#输出:
The size is xl and the words is i'm a hacker

将xl储存到size_s中 ,i'm a hacker储存到words_w中,原因是xl在前面对应的也就是size , 当然如果i'm a hacker 在前面,就会将这段话存储到size中。那么就会闹笑话。
为了不闹笑话所以接下来要提到的是关键字传参

关键字传参

关键字实参是传递给函数的名称—值对。你直接在实参中将名称和值关联起来了,因此向函
数传递实参时不会混淆(不会得到名为Hamster的harry这样的结果)。关键字实参让你无需考虑函
数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途。
举个例子

def make_shirt(size_s, words_w):
    print("\nThe size is " +size_s + " and the words is " +words_w)
make_shirt(size_s = "xl" , words_w  = "I'm a hacker")

看出将xl储存进size,将i'm a hacker储存进word里,就不会闹笑话了。
( ,,´・ω・)ノ"(´っω・`。)

默认值

def make_shirt(size_s, words_w = "I'm a hacker"):
    print("\nThe size is " + size_s)
make_shirt(size_s = "big size")

将i'm a hacker 储存给word_w的值,在后面如果不另有声明则word_w一直都为这句话。
*有两个非常重要的地方,第一个是具有默认值的参数后面不能再有普通参数,比如 f(a,b=90,c) 就是错误的。
第二个是默认值只被赋值一次,因此如果默认值是任何可变对象时会有所不同,比如列表、字典或大多数类的实例。例如,下面的函数在后续调用过程中会累积(前面)传给它的参数:*

>>> def f(a, data=[]):
...     data.append(a)
...     return data
...
>>> print(f(1))
[1]
>>> print(f(2))
[1, 2]
>>> print(f(3))
[1, 2, 3]

如果要避免这个问题需要如下操作

>>> def f(a, data=None):
...     if data is None:
...         data = []
...     data.append(a)
...     return data
...
>>> print(f(1))
[1]
>>> print(f(2))
[2]

返回值

return是我们要用到的
举个例子
假设题目是定制衣服,首先呢你要定制衣服的尺码,在此之上衣服上有固定词汇,以及还有anthor可供你自定义的句子
如下


def make_shirt(size_s, words_w,anthor):
    shirt =  "\nThe size is " +size_s + " and the words is " +words_w + " and the anthor is " +anthor
    return shirt.upper()

final = make_shirt("xl" , "I'm a hacker" ,"I wanna be a hacker")
print(final)


输出:THE SIZE IS XL AND THE WORDS IS I'M A HACKER AND THE ANTHOR IS I WANNA BE A HACKER

我们定义了一个函数make_shirt(),将("\nThe size is " +size_s + " and the words is " +words_w + " and the anthor is " +anthor)这些储存给了shirt,接下将这些字母大写用到了upper(),并将结果返回到函数调用行。接下来调用返回值需要变量,我们用到final,最后print

当然如果一些人不想定制的额外的话
那我们可以改一下这段代码,让他更人性化

def make_shirt(size_s, words_w,anthor = ''):
    if anthor:
        shirt = "\nThe size is " +size_s + " and the words is " +words_w + " and the anthor is " +anthor
    else:
        shirt = "\nThe size is " +size_s + " and the words is " +words_w + " "

    return shirt.upper()

final = make_shirt("xl" , "I'm a hacker" ,"I wanna be a hacker")
print(final)

final = make_shirt("xl" , "I'm a hacker")
print(final)


输出:
THE SIZE IS XL AND THE WORDS IS I'M A HACKER AND THE ANTHOR IS I WANNA BE A HACKER

THE SIZE IS XL AND THE WORDS IS I'M A HACKER 

这里有个关键是,为了有些人不用到 anthor,所以给他赋予了默认值——空值,为了能让程序运行,将其放在列表的末尾

当然还可以返回列表,字典等
在这里呢我也就不自己举例子,我引用资料书上的内容


def build_person(first_name, last_name, age=''):
 """返回一个字典,其中包含有关一个人的信息"""
 person = {'first': first_name, 'last': last_name}
 if age:
 person['age'] = age
 return person
musician = build_person('jimi', 'hendrix', age=27)
print(musician) 

当然也可以和循坏结合起来了
在这我也就继续引用书上的内容了

def get_formatted_name(first_name, last_name):
    full_name = first_name + ' ' + last_name
    return full_name.title()

while True:
    print("\nPlease tell me your name:")
    print("(enter 'q' at any time to quit)")

    f_name = input("First name: ")
    if f_name == 'q':
        break

    l_name = input("Last name: ")
    if l_name == 'q':
        break

formatted_name = get_formatted_name(f_name, l_name)
print("\nHello, " + formatted_name + "!")

传递列表

将列表传递给函数后,函数就能直接访问其内容。下面使用函数来提高处理列表的效率

def greet_users(names):
 """向列表中的每位用户都发出简单的问候"""
for name in names:
    msg = "Hello, " + name.title() + "!"
print(msg)
usernames = ['hannah', 'ty', 'margot']
greet_users(usernames) 

我们将greet_users()定义成接受一个名字列表,并将其存储在形参names中。这个函数遍历收到的列表,并对其中的每位用户都打印一条问候语。我们定义了一个用户列表——usernames,然后调用greet_users(),并将这个列表传递给它

有时候能可以多用几个函数,让整个程序看着简单明了

def print_models(unprinted_designs, completed_models):
    """
    模拟打印每个设计,直到没有未打印的设计为止
    打印每个设计后,都将其移到列表completed_models中
    """
    while unprinted_designs:
        current_design = unprinted_designs.pop()

        # 模拟根据设计制作3D打印模型的过程
        print("Printing model: " + current_design)
        completed_models.append(current_design)

def show_completed_models(completed_models):
    """显示打印好的所有模型"""
    print("\nThe following models have been printed:")
    for completed_model in completed_models:
        print(completed_model)

# 调用函数
print_models(unprinted_designs, completed_models)
show_completed_models(completed_models)

传递任意数量的实参

有时候,你预先不知道函数需要接受多少个实参,好在Python允许函数从调用语句中收集任意数量的实参。

def make_pizza(*toppings):
 """概述要制作的比萨"""
 print("\nMaking a pizza with the following toppings:")
 for topping in toppings:
 print("- " + topping)

make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')


输出:
Making a pizza with the following toppings:
- pepperoni
Making a pizza with the following toppings:
- mushrooms
- green peppers
- extra cheese

*toppings的意思是创建一个名为toppings的空元组,并将收到的所有值都封装到这个元组中。
不管函数收到的实参是多少个,这种语法都管用

将函数存储在模块中

函数的优点之一是,使用它们可将代码块与主程序分离。通过给函数指定描述性名称,可让主程序容易理解得多。你还可以更进一步,将函数存储在被称为模块的独立文件中,再将模块导入到主程序中。import语句允许在当前运行的程序文件中使用模块中的代码。
接下来我将介绍几种方法,先前提假设一个python文件 hack.py (这个文件中包含一个函数 hacker() )。如果我们想在另一个py文件中(IOT.py),用到hack.py这个文件

First

import hack #这就是一种导入方法:只需编写一条import语句并在其中指定模块名,就可在程序中使用该模块中的所有函数。如 
             果你使用这种import语句导入了名为module_name.py的整个模块,就可使用下面的语法来使用其中任何一个函数
module_name.function_name()
example:   hack.hacker()

Second

还可以导入模块中的特定函数,这种导入方法的语法如下

from module_name import function_0, function_1, function_2
example: from hack import hacker

Third

导入模块中的所有函数,使用星号(*)运算符可让Python导入模块中的所有函数:

from module_name import * 
example: from hack import *
         hacker(要填写的东西)

Forth

使用 as 给模块指定别名

import hack as h
h.hacker()

import module_name as mn

这样不仅能使代码更简洁,还可以让你不再关注模块名,而专注于描述性的函数名。这些函数名明确地指出了函数的功能,对理解代码而言,它们比模块名更重要。

最后修改:2024 年 07 月 09 日
如果觉得我的文章对你有用,请随意赞赏