函数

一、定义函数

使用关键字def定义函数。

def get_name():
  """打印名字"""
  print("Hello")

get_name()

get_name为函数名,在get_name( ):后面的所有缩进行构成了函数体。而在上面代码中的第二行的文本是被称为文档字符串的注释,描述了函数使用来做什么的。

1. 向函数传递信息

可以在函数定义def get_name( )的括号内添加username,通过这里添加username,就可以让函数接受给函数指定的值。

def get_name(username):
  """打印名字"""
  print(username)

get_name('jie')

2. 实参和形参

在函数中,定义函数时的参数为形参,调用函数的时候传递的参数为实参。如get_username的代码中,username为形参,而'jie'为实参。

二、传递实参

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

1. 位置实参

def get_name(first, last):
  """打印姓名"""
  firstname = first
  lastname = last
  print(firstname + " " + lastname)
 
get_name("bill", "su")

位置实参的顺序很重要,如果位置实参的顺序到了,在函数中的形参的值也会颠倒。

2. 默认值

在编写函数的时候,可以给每一个形参一个默认值。在调用函数时,如果给形参提供了实参,则将使用指定的实参值,否则,就使用形参的默认值。

def get_name(username = 'Tom'):
  """打印名字"""
  print(username)

get_name()

三、返回值

函数可以处理一些数据,并返回一个或一组值。函数返回的值被称为返回值。在函数中,可使用==return==语句将值返回到调用函数的代码行

1. 返回简单值

def get_name(first, last):
  """打印名字"""
  firstname = first
  lastname = last
  full_name = firstname + " " + lastname
  return full_name

full_name = get_name('bill', 'su')
print(full_name)

2. 让实参变成可选的

有时候,需要让实参变成可选的,这样使用函数的人就只需要在必要时才提供额外的信息。可使用默认值来让实参变成可选的。

def get_name(first, last = ''):
  if last:
    print(first + last)
  else:
    print(first)
    
get_name('bill')

3. 返回字典

函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。

def get_name(first, last):
  person = {'first': first, 'last': last}
  return person

musician = get_name('jim', 'hen')
print(musician)

四、传递列表

函数可以传递列表,这种列表可以包含的可能是名字、数字或更复杂的对象(如字典)。将列表传递给函数后,函数就能直接访问其内容。

def greet_name(names):
  for name in names:
    msg = "Hello" + " " + name.title() + "!"
    print(msg)
    
user_names = ['han', 'ty', 'jim']
greet_name(user_names)

1. 在函数中修改列表

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

def del_name(names):
  names.pop()
    
names = ['han', 'ty', 'jim']
del_name(names)
print(names)

2. 禁止函数修改列表

可以向函数传递列表的副本而不是元件,这样函数所做的任何修改都只影响副本。

def del_name(names):
  names.pop()
  print("修改后的列表副本:")
  print(names)
    
names = ['han', 'ty', 'jim']
del_name(names[:])
print("调用函数后的列表:")
print(names)

五、传递任意数量的实参

下面的函数只有一个形参*names,但不管调用语句提供了多少实参,这个形参都将它们统统纳入囊中。

def names(*names):
  print(names)

names('jim')
names('jim', 'make', 'len')

形参名*names 中的星号让Python创建一个名为names的空元组,并将收到的所有值都封装到这个元组中。函数体内的print语句通过生成输出来证明Python能够处理使用一个值调用函数的情形,也能处理使用三个值来调用函数的情形。

1. 结合使用位置实参和任意数量的实参

如果让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。Python先匹配位置实参和关键字实参,再将余下的实参收集到最后一个形参中。

def make_pizza(size, *toppings):
  print("\nmakeing a"+ str(size) + 
        "-inch pizza with the folling topping")
  for topping in toppings:
    print("-"+ topping)
    
make_pizza(16, 'peppersion')
make_pizza(12, 'pepper', 'green peppers')

3. 使用任意数量的关键字实参

有时候,需要接受任意数量的实参,但预先不知道传递给函数的会是什么样的信息。在这种情况下,可将函数编写成能够接受任意数量的键-值对——调用语句提供了多少就接受多少。

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', 'jim',
                             location='princetion',
                             field='physics')
print(user_profile)

形参**user_info中的两个星号让Python创建一个名为profile的空字典,用于存储用户简介。

六、将函数存储在模块中

函数的优点之一是:使用它们可将代码块与主程序分离。通过给函数指定描述性名称,可让主程序容易理解的多。还可以更进一步,将函数文件存储在被称为模块的独立文件中,再将模块倒入到主程序中。import语句允许在当前运行的程序文件中使用模块中的代码。

通过将函数存储在独立的文件中,可隐藏程序代码的细节,将重点放在程序的高层逻辑上。这能够在众多的程序中重用函数。将函数存储在独立文件中后,可与其它程序员共享这些文件而不是整个程序,

1. 导入整个模块

要让函数是可导入的,得先创建模块。模块是扩展名为.py的文件,包含要导入到程序中的代码。

pizza.py
def make_pizza(size, *toppings):
  print("\nmakeing a"+ str(size) + 
        "-inch pizza with the folling topping")
  for topping in toppings:
    print("-"+ topping)
making_pizzas.py
import pizza

pizza.make_pizza(16, 'peppersion')
pizza.make_pizza(12, 'pepper', 'green peppers')

2. 导入特定的函数

还可以导入模块中的特定函数:

from pizza import makez_pizza

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

from module_name import function_0, function_1, function_2

3. 使用as给函数指定别名

如果要导入的函数的名称可能与程序中现有的名称冲突,或者函数的名称太长,可指定简短二独一无二的别名——函数的另一个名称,类似于外号。

from pizza import make_pizza as mp
  
mp(16, 'peppersion')
mp(12, 'pepper', 'green peppers')

4. 使用as给模块指定别名

import pizza as p

p.make_pizza(16, 'peppersion')
p.make_pizza(12, 'pepper', 'green peppers')

5. 导入函数中的所有函数

import语句中的星号让Python将模块pizza中每个函数都复制到这个程序文件中。由于导入了每个函数,可通过名称来调用每个函数与,而无需使用句点表示法。

from pizza import *

make_pizza(16, 'peppersion')
make_pizza(12, 'pepper', 'green peppers')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。