《Python编程从入门到实践》学习笔记7(第8章:函数)

1、关键字def用来定义函数,指出函数名,括号内指出函数为完成其任务需要什么样的信,(括号必不可少),定义以冒号结尾。

   文档字符串描述了函数是做什么的,用三引号括起,Python使用它们来生成有关程序中函数的文档。

   调用函数,可依次指定函数名以及括号括起的必要信息。

2、形参是完成其工作所需的一项信息。  实参是调用函数时传递给函数的信息。(函数调用过程中,将实参传递给形参)

   向函数传递实参的方式有很多,可使用位置实参,这要求实参的顺序与形参的顺序相同;也可使用关键字实参,其中每个实参都由变量名和值组成,要求准确地指定函数定义中的形参名;还可使用列表和字典。

3、编写函数时,可给每个形参指定默认值。使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参。这让Python依然能够正确地解读位置实参。

4、提供的实参多于或少于函数完成其工作所需的信息时,将出现实参不匹配错误。

5、函数并非总是直接显示输出,它可以处理一些数据,并返回一个或一组值。函数返回的值称为返回值。可使用return语句将值返回到调用函数的代码行。

6、让实参变成可选的。

def get_formatted_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.title()

musician = get_formatted_name('jimi','hendrix')
print(musician)

musician = get_formatted_name('join','hooker','lee')
print(musician)

  为了让中间名变成可选的,给形参middle_name指定了一个默认值——空字符串,并在用户没有提供中间名时不使用这个形参。输出结果如下:

Jimi Hendrix
Join Lee Hooker

7、函数可返回任何类型的值。
  下面的函数接受姓名的组成部分,并返回一个表示人的字典,其中age是可选形参。

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)

  此时原来的两项文本信息存储在一个字典中:

{'first': 'jimi', 'last': 'hendrix', 'age': 27}

8、将列表传递给函数后,函数就可以对其进行修改。在函数中对这个列表所做的任何修改都是永久性的。

    有时候,需要禁止函数修改原来的列表。可以向函数传递列表的副本而不是原件。function_name(list_name[:]) ,切片表示法[:]创建列表的副本。

9、p129 8-9~8-11魔术师列表的操作。

def show_magicians(magicians):
    for magician in magicians:
        print(magician)

def make_great(magicians):
    great_magicians = []
    while magicians:
        magician = magicians.pop()
        great_magician = magician+' the Great'
        great_magicians.append(great_magician)
    for great_magician in great_magicians:
        magicians.append(great_magician)
    return ( magicians)

magicians = ['john','hanny','mary']
show_magicians(magicians)

print("
Great magicians:")
great_magicians = make_great(magicians[:])
show_magicians(great_magicians)

print("
Original magicians:")
show_magicians(magicians)

笔者因为一个字母敲错,找了半小时,终于得到想要的输出。输出结果:

john
hanny
mary

Great magicians:
mary the Great
hanny the Great
john the Great

Original magicians:
john
hanny
mary

10、传递任意数量的实参。

def make_pizza(*toppings):
    """打印顾客点的所有配料"""
    print(toppings)

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

  *tpppings中的星号让Python创建一个名为toppings的空元组,并将收到的所有值都封装到这个元组中。注意,Python将实参封装到一个元组中,即便函数只收到一个值也如此:

('pepperoni',)
('mushrooms', 'green peppers', 'exter cheese')

如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参放在最后。

def make_pizza(size,*toppings):
    """概述要制作的披萨"""
    print("
Making a " + str(size) +
          "-inch pizza with the following toppings:")
    for topping in toppings:
        print("- " + topping)
make_pizza(16,'pepperoni')
make_pizza(32,'mushrooms','green peppers','exter cheese'

输出结果:

Making a 16-inch pizza with the following toppings:
- pepperoni

Making a 32-inch pizza with the following toppings:
- mushrooms
- green peppers
- exter cheese

11、使用任意数量的关键字实参。

def build_profile(first,last,**user_info):
    """创建一个字典,其中包含我们知道的有关用户的一切"""
    profile = {}
    profile['first_name'] = first
    profile['last_name'] = last
    for key,value in user_info.items():
        profile[key] = value
    return profile

user_profile = build_profile('albert','estein',
                             location='princeton',
                             field='physics')
print(user_profile)

  形参**user_info的两个星号让Python创建一个名为user_info的空字典,并将收到的所有名称-值对都封装在这个字典中。

12、将函数存储在模块中,再将模块导入到主程序中。import语句允许在当前允许的程序文件中使用模块代码。

(1)导入整个模块。

首先建立一个pizza.py文件。

再创建另一个文件making_pizza.py

import pizza

pizza.make_pizza(16,'pepperoni')
pizza.make_pizza(32,'mushrooms','green peppers','exter cheese')

  这就是一种导入方法:只需要编写一条import语句并在其中指定模块名,就可以在程序中使用该模块中的所有函数。module_name.function_name()

 (2)导入特定的函数

导入语法如下:

from module_name import function_name

通过逗号分隔函数名,可根据需要从模块中导入任意数量的函数:

from module_name import function_0,function_1,function_2

对于前面的making_pizza.py示例,如果只想导入要使用的函数,代码类似与下面这样:

from pizza import make_pizza

make_pizza(16,'pepperoni')
make_pizza(32,'mushrooms','green peppers','exter cheese')

(3) 使用as给函数指定别名,如果要导入的名称可能与程序中现有的名称冲突,或者函数名称太长,可指定简短而独一无二的别名。

  下面给函数make_pizza()指定了别名mp()。

  from pizza import make_pizza as mp

  指定别名的通用语法: from module_name import function_name as fn

  as还可以给模块指定别名,通用语法:import module_name as mn

(4)导入模块中的所有函数,可以使用星号(*)运算符。

from pizza import *

make_pizza(16,'pepperoni')
make_pizza(32,'mushrooms','green peppers','exter cheese')

  由于导入每个函数,可通过名称直接调用每个函数,而无需用句点表示方法。然而,使用并非自己编写的大型模块时,最好不要采用这种导入方法:如果模块中有函数名称与你的项目中使用的名称相同,可能导致意想不到的结果:Python可能遇到多个名称相同的函数或变量,进而覆盖函数,而不是分别导入所有的函数。

  最佳的做法是,要么导入你需要使用的函数,要么导入整个模块并使用句点表示法。这能使得代码更清晰。

13、每个函数都应该包含简要地阐述其功能的注释,该注释应紧跟函数定义后面,并采用文档字符串格式。给形参指定默认值时,等号两边不要有空格。对于函数的调用中的关键字实参,也遵循这种约定。

14、如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开,这样将更容易知道前一个函数在什么地方结束,下一个函数从什么地方开始。

  所有的import语句都应该放在文件的开头,唯一例外的情形是,在文件开头使用了注释描述整个程序。

原文地址:https://www.cnblogs.com/cathycheng/p/11196797.html