Python编程从入门到实践之函数2|第9天

User:你好我是森林 Date:2018-03-22 Mark:《Python从入门到实践》 原文:https://www.jianshu.com/p/0bfe4f1adda9

函数(二)

传递列表

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

代码示例:

def greet_users(names): 
    """向列表中的每位用户都发出简单的问候""" 
    for name in names:
        msg = "Hello, " + name + "!"
        print(msg)

usernames = ['Hannah', 'Ty', 'Margot'] greet_users(usernames)

传入一个列表,进行循环遍历打印,然后得到如下结果。

运行结果:

Hello, Hannah!
Hello, Ty!
Hello, Margot!
在函数中修改列表

由上面的例子可以得出,函数在遍历的过程中是可以通过一些函数进行修改的。例如将传入的值全部变为大写。代码如下:

def greet_users(names): 
    """向列表中的每位用户都发出简单的问候""" 
    for name in names:
        msg = "Hello, " + name.upper() + "!"
        print(msg)

usernames = ['hannah', 'ty', 'margot'] greet_users(usernames)

当然,也可以进行复杂的修改操作。例如把传入的列表复制给第二个列表;同样,我们也可以紧致修改列表。

禁止函数修改列表

将列表的副本传递给函数就可以实现没有修改列表。切片表示法[:]创建列表的副本。语法如下:

function_name(list_name[:])

传递任意数量的实参

利用*定义为一个空元组就可以将所有传入的实参都进行打印。例如:

def make_pizza(*toppings): 
    """打印顾客点的所有配料""" 
    print(toppings)
 
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')

无论传入多少值都可以被打印出来。

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

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

def make_pizza(size, *toppings):
        """概述要制作的比萨""" 
        print("\nMaking a " + str(size) + "-inch pizza with the following toppings:")
       for topping in toppings:
        print("- " + topping)
        
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
使用任意数量的关键字实参

有时候,需要接受任意数量的实参,但预先不知道传递给函数的会是什么样的信息。在这种情况下,可将函数编写成能够接受任意数量的键—值对——调用语句提供了多少就接受多少。只要坚持一个原则,无论用户输入的实参有多少信息,采用遍历的方式将其逐步返回,然后打印就可以实现无论用户输入什么信息就返回。

将函数存储在模块中

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

导入整个模块

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

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

保存为make_pizza.py的文件,然后创建一个新的文件make.py。代码如下:

import  make_pizza

make_pizza.make_pizza(16, 'pepperoni')

运行后结果如下:

➜  day8 python make.py
Making a 16-inch pizza with the following toppings:
- pepperoni
导入模块的某些函数

既然可以导入整个模块,说明是能完全读取整个模块的信息,同理,可以推出,我们导入文件的时候是不是可以将某些函数导入进入使用呢?具体的语法如下:

导入某一个函数:

from module_name import function_name

导入某些函数,也就是多个函数:

from module_name import function_0, function_1, function_2

具体的使用方法同理,相当于该函数就可以被调用,和函数调用一致,没有什么区别。即:

from pizz import make_pizz

make_pizz(12,'demo_pizz')
使用as给函数指定别名

某些业务的需求,函数名可能有特别长,但是在新的模块文件中,我们不需要这样的函数名,一来影响代码的美观;二来对开发人员不太友好,于是采用关键字as可以给函数取一个在新的模块中的别名。具体的语法如下:

from module_name import function_name as fun_name

在这里可以看到fun_name就是起的别名,在调用的时候就可以直接采用fun_name进行调用。具体调用方法如下:

from pizz import make_install_pizz_div as mpip

mpip(14,'pizz_name')

具体的调用和实际导入的函数没有什么区别,同样的使用。但是为了提高代码的可读性,建议最好将别名取的有意义。

使用as给模块指定别名

使用**as**给函数指定别名可以推出,同样可以为模块取一个更有意义或者更适合自己的别名。在日常的Python开发中,常用的库或模块有很多,我们同样可以进行别名的方式来实现。具体语法如下:

import module_name as mn

使用方式不再阐述,和没有指定别名的方式是一样的。

导入模块中的所有函数

在日常开发中*通常是通配符的意思,所以我们要实现一个导入模块的所有函数可以用*来实现。具体语法如下:

from module_name import * 

调用对应函数的方法和上面类似,不做过多的阐述。

函数编写指南

原文内容

编写函数时,需要牢记几个细节。应给函数指定描述性名称,且只在其中使用小写字母和下划线。描述性名称可帮助你和别人明白代码想要做什么。给模块命名时也应遵循上述约定。

每个函数都应包含简要地阐述其功能的注释,该注释应紧跟在函数定义后面,并采用文档字符串格式。文档良好的函数让其他程序员只需阅读文档字符串中的描述就能够使用它:他们完全可以相信代码如描述的那样运行;只要知道函数的名称、需要的实参以及返回值的类型,就能在自己的程序中使用它。

给形参指定默认值时,等号两边不要有空格。PEP 8建议代码行的长度不要超过79字符,这样 只要编辑器窗口适中,就能看到整行代码。如果形参很多,导致函数定义的长度超过了79字符,可在函数定义中输入左括号后按回车键,并在下一行按两次Tab键,从而将形参列表和只缩进一层的函数体区分开来。大多数编辑器都会自动对齐后续参数列表行,使其缩进程度与你给第一个参数列表行指定的 缩进程度相同:

如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开,这样将更容易知道前一个函数在什么地方结束,下一个函数从什么地方开始。所有的import语句都应放在文件开头,唯一例外的情形是,在文件开头使用了注释来描述整个程序。

原文链接:你好我是森林

欢迎转载分享,但请标记来源,谢谢。

知识星球

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

【答疑解惑第三十一讲】如何使用全局变量?

疑惑一 全局变量如何用? ? 看图中的箭头的地方,声明全局变量的时候使用了static,这个问题就涉及到了static的使用,如果要使用全局变量,并且在多文件中...

35590
来自专栏java技术学习之道

一张图搞定Java原型模式

19050
来自专栏强仔仔

AngularJS系列之表达式

这节介绍一下AngularJS中表示式的用法。使用表达式可以把数据绑定到HTML中去,使用起来非常方便。不过在使用之前得先引用AngularJS文件,这个文件可...

19370
来自专栏Python小屋

Python运算符+与+=的那些事

这两个运算符很多语言都提供了,好像也没啥好说的,不就是像下面这样子用嘛。 >>> x = 3 >>> y = x+6 >>> y 9 >>> x += 6 >>...

28150
来自专栏微信公众号:Java团长

触摸Java常量池

java常量池是一个经久不衰的话题,也是面试官的最爱,题目花样百出,这次好好总结一下。

31710
来自专栏coding for love

JS进阶系列02-JS面向对象的三大特征之封装

JS 作为面向对象的一门语言,拥有和其他面向对象语言一样的三大特征,即封装(encapsulation)、继承(inheritance )和多态(polymor...

13420
来自专栏用户2442861的专栏

Python基础学习篇——Global全局变量的使用

为了测试Python中全局变量的使用,我们试图撰写以下几个例子进行说明: #第一例子,是用来验证一个最基础的全局变量与局部变量的区别,内容如下: #-*- c...

11500
来自专栏V站

PHP反序列化深入理解

在PHP中右serialize()和unserialize()两个函数,php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。u...

23950
来自专栏云霄雨霁

Java虚拟机--类加载过程

21280
来自专栏白驹过隙

Python - 学习经验分享

331120

扫码关注云+社区

领取腾讯云代金券