16 python 函数和模块

论坛 期权论坛 期权     
咸鱼飞龙门   2019-6-29 20:45   2625   0
python 中的函数
在编程中函数是必不可少的,函数对于代码的复用、编写都是有很大作用的。要善于利用函数,以减少重复编写程序段的工作量。
定义函数
  1. 1
复制代码
  1. def
复制代码
  1. greet_user():2     
复制代码
  1. """say hello"""
复制代码
  1. 3     print("hello !")4 greet_user()
复制代码


上面我们定义了一个函数。def 是一个关键字,通过 def 关键字来告诉 python 接下来我们定义的是一个函数。蓝色部分代码为 文档字符串 ,描述了函数是做什么的,通过三引号括起,python 使用它们来生成有关程序中函数的文档。第三行是函数要做的操作。第四行是函数的调用。这个函数不需要任何信息,因此调用它是只需要输入函数名就可以了。

向函数传递信息
  1. def
复制代码
  1. greet_user(username):    """say hello"""    print("hello," + username.title() + "!")greet_user('jack')
复制代码


在调用函数的时候传递一个参数,函数在定义的时候也要定义为需要传参的形式。
在函数传参的时候要注意 实参 和 形参 的区别,在这里我就不讲了,也讲不好,想复习的小伙伴可以去搜下。

关键字实参
函数调用的时候,实参的传递顺序要和实参保持一致,如果不保持一致的话可能会出现意想不到的问题。但是我们可以使用 关键字实参 的方法,使得顺序不必保持一致还可以正确的运行程序。
  1. def greet_user(username , sex):    """say hello"""    print("hello," + username.title() + ", you are a " + sex)greet_user(sex = 'man', username = 'jack')
复制代码


实现的方法也很简单,只不过是明确的指出了各个实参对应的形参。
函数默认值
编写函数时,可给每个形参指定默认值。在函数调用时,给形参提供了实参时, python 将使用指定的实参值;否则,将使用形参的默认值。因此,给形参指定默认值后,可在函数调用中省略对应的实参。使用默认值可简化函数调用,还可清楚的指出函数的典型用法。(看官方文档的时候,我们会发现很多函数是提供默认参数的。)
  1. def greet_user(username ,
复制代码
  1. sex = "man"
复制代码
  1. ):    """say hello"""    print("hello," + username.title() + ", you are a " + sex)greet_user(
复制代码
  1. username = 'jack'
复制代码
  1. )
复制代码


在上面的例子中,将 sex 的默认值设置为 "man" , 在函数调用的时候只传递了 username 这一个值就可以了。再看下面的例子
  1. def greet_user(sex = "man" ,username):    """say hello"""    print("hello," + username.title() + ", you are a " + sex)#greet_user( username = 'jack')greet_user( 'jack')
复制代码


在这里就报错了,错误原因是缺少参数。和其他语言一样,在使用默认值的时候,在形参列表中要先列出没有默认值的形参,再列出有默认值的形参,这样可以使 python 正确解读位置实参。
函数返回值
调用函数可以处理一些数据并返回一个或一组值。函数返回的值被称为返回值。
  1. def greet_user(first_name,last_name):    """say hello"""    full_name = first_name  + " " + last_name    return full_namemy_name = greet_user( 'jack',"cui")print(my_name)
复制代码


可选实参
有时候,我们需要让实参变成可选的,这样使用函数的人就只需要在必要时才提供额外的信息,可使用默认值使实参变成可选的。
  1. def
复制代码
  1. greet_user
复制代码
  1. (
复制代码
  1. first_name
复制代码
  1. ,
复制代码
  1. last_name
复制代码
  1. ,
复制代码
  1. middle_name
复制代码
  1. = ""):   
复制代码
  1. """say hello"""
复制代码
  1.    
复制代码
  1. if
复制代码
  1. middle_name:        full_name = first_name  + " "+ middle_name + " " + last_name   
复制代码
  1. else
复制代码
  1. :        full_name = first_name  + " " + last_name   
复制代码
  1. return
复制代码
  1. full_namemy_name =
复制代码
  1. greet_user
复制代码
  1. ( '
复制代码
  1. jack
复制代码
  1. ',"
复制代码
  1. cui
复制代码
  1. ","
复制代码
  1. A
复制代码
  1. ")
复制代码
  1. print
复制代码
  1. (my_name)my_name =
复制代码
  1. greet_user
复制代码
  1. ( '
复制代码
  1. jack
复制代码
  1. ',"
复制代码
  1. cui
复制代码
  1. ")
复制代码
  1. print
复制代码
  1. (my_name)
复制代码


返回字典
函数可返回任何类型的值,包括列表和字典。
  1. def
复制代码
  1. greet_user
复制代码
  1. (
复制代码
  1. first_name
复制代码
  1. ,
复制代码
  1. last_name
复制代码
  1. ):     person = {'
复制代码
  1. first
复制代码
  1. ':first_name,'last':last_name}     
复制代码
  1. return
复制代码
  1. personname =
复制代码
  1. greet_user
复制代码
  1. ( '
复制代码
  1. jack
复制代码
  1. ',"
复制代码
  1. cui
复制代码
  1. ")
复制代码
  1. print
复制代码
  1. (name)
复制代码


笑对人生,能穿透迷雾;笑对人生,能坚持到底;笑对人生,能化解危机;笑对人生,能照亮黑暗。
禁止函数修改列表
我们将列表作为函数的参数进行传递的时候,如果在函数里面列表被修改了,那么这个列表也就真正的被修改了,但是有时候我们既想完成我们的操作,又想列表保持原来的样子,这个时候可以用切片的方法来实现。
  1. fuction_name(list_name[:])
复制代码
在这里,切片创建了列表的副本。这样函数依旧可以完成工作,而且使用的是列表的副本,而不是列表本身,函数对列表所作的操作不会影响到原列表。
传递任意数量的实参
有些时候,我们预先并不知道函数需要接收多少个实参,但是 python 已经为我们想到了这点。
  1. def
复制代码
  1. say_name
复制代码
  1. (*name):   
复制代码
  1. """打印名字"""
复制代码
  1.    
复制代码
  1. print
复制代码
  1. (name)
复制代码
  1. say_name
复制代码
  1. ("
复制代码
  1. jack
复制代码
  1. ","
复制代码
  1. david
复制代码
  1. ","
复制代码
  1. joy
复制代码
  1. ","
复制代码
  1. tom
复制代码
  1. ")
复制代码
形参名 *name 中的 * 让 python 创建了一个名为 name 的空元组,并将说到的所有值都封装到这个元组中。这里虽然没有 for 循环语句,但是 print 依旧输出了我们定义的每个元组元素。
如果我们要接受不同类型的实参,必须要将接收任意数量实参的形参放到后面。就像下面这样。
  1. def
复制代码
  1. say_name
复制代码
  1. (
复制代码
  1. kind
复制代码
  1. ,*name):
复制代码
  1.    
复制代码
  1. """打印名字"""
复制代码
  1.    
复制代码
  1. print
复制代码
  1. (kind)
复制代码
  1. [/code]
  2. [code]   
复制代码
  1. print
复制代码
  1. (name)
复制代码
  1. say_name
复制代码
  1. ("
复制代码
  1. person
复制代码
  1. ","
复制代码
  1. jack
复制代码
  1. ","
复制代码
  1. david
复制代码
  1. ","
复制代码
  1. joy
复制代码
  1. ","
复制代码
  1. tom
复制代码
  1. ")
复制代码
使用任意数量的关键字实参
有时候需要接受任意数量的实参,但是预先不知道传递给函数的会是什么样的信息。在这种情况下,可将函数编写成能够接受任意数量的键-值对。调用语句提供了多少就接受多少。
  1. def
复制代码
  1. build_profile
复制代码
  1. (
复制代码
  1. first
复制代码
  1. ,
复制代码
  1. last
复制代码
  1. ,**user_info):   
复制代码
  1. """创建一个字典,
复制代码
  1. 包含我们知道的用户的信息"""
复制代码
  1.     profile= {}    profile["
复制代码
  1. first_name
复制代码
  1. "]= first    profile["
复制代码
  1. last_name
复制代码
  1. "] = last   
复制代码
  1. for
复制代码
  1. key ,value
复制代码
  1. in
复制代码
  1. user_info.
复制代码
  1. items
复制代码
  1. ():        profile
复制代码
  1. [key] = value   
复制代码
  1. return
复制代码
  1. profile
复制代码
  1. user_profile =
复制代码
  1. build_profile
复制代码
  1. ('albert','einstein',                                
复制代码
  1. location
复制代码
  1. ='
复制代码
  1. peinceton
复制代码
  1. ',                                
复制代码
  1. field
复制代码
  1. = '
复制代码
  1. physics
复制代码
  1. ')
复制代码
  1. print
复制代码
  1. (user_profile)
复制代码


形参 **user_info 中的两个 ** 让 python 创建了一个名为 user_info 的空字典。剩下的部分自己就自己理解了,仔细看,不明白就多看。
python 中的模块
函数的优点之一是,可将代码块与主程序分离。通过给函数指定描述性名称,可让主程序容易理解很多。我们还可以更近一步,将函数存贮在被称为 模块 的独立文件中,再将模块导入到主程序。 可以使用 import 语句在当前运行的程序文件中导入模块中的函数。
导入模块
我们先来创建一个模块,模块的扩展名是 .py 的文件,包含要导入到程序中的代码。


接下来我们将这个模块导入。


要调用被导入的模块中的函数,可指定导入的模块的名称和函数名,中间用 点号 “.” 隔开。
导入特定的函数
我们可以导入模块中特定的函数。
  1. form module_name import fuction_name0,fuction_name1,fuction_name2
复制代码
使用 from 的方法在调用函数的时候无需使用 点号。
给函数指定别名
如果要导入的函数的名称和本程序中的现有的函数名称冲突,或者名字太长使用不方便,我么可以给它起一个别名。
  1. form module_name import fuction_name0 as name0
复制代码
同理,我们也可以给模块起别名
  1. import module_name as M
复制代码
我们可以一次性的导入模块中的所有函数。
  1. from module_name import *
复制代码
使用这种方法可以一次性的将模块中的所有方法导入到本文件中,而且在调用的时候不必使用 点号 。但是不推荐使用这种方法,一位在编写大型程序时,自己程序中的方法名难免和模块中的方法名重复,会出现意想不到的错误。



昨天没有更新,今天补上,来一个长的好吧。





喜欢记得来一个好看


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:15
帖子:3
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP