Python函及模块的使用

 更新时间:2021年11月01日 09:07:10   作者:一碗周  
这篇文章主要介绍了Python函及模块的使用,基本函数包括定义函数、函数的参数、用模块管理函数等一些基本定义,下面文章不仅对这些又说描述,还有变量的作用域的详细内容,需要的朋友可以参考一下,希望对你有所帮助

1、函数的作用

编程大师Martin Fowler先生曾经说过:“代码有很多种坏味道,重复是最坏的一种! ”。

可以将重复的功能封装到一个称之为“函数”的功能模块中,用来实现单一,或相关联功能的代码段。

2、定义函数

定义函数的规则如下所示:

  • 函数代码块以 def 关键词开头,后接函数名和圆括号 () 。
  • 函数名命名规则跟变量的命名规则是一致
  • return关键字用于退出函数,选择性地向调用方返回一个表达式。

语法如下所示:

def 函数名(参数列表):
    函数体
    return语句

# 定义一个函数 往里面穿两个参数
def sum(arg1, arg2):
    # 返回2个参数的和."
    total = arg1 + arg2
    return total


# 调用sum函数
sumNum = sum(10, 20)
print(sumNum) // 30

3、函数的参数

除了定义函数和调用函数等基本操作之外,在函数中还可以使用参数。函数的参数简单的来说就是可以函数的函数体中使用的变量。与变量不同的是,这样的变量的是在函数体之前传递进去的。

3.1 参数的默认值

调用函数时,如果没有传递参数,则会使用默认参数。

def printInfo(name, age=12):
    "打印任何传入的字符串"
    print("名字: ", name)
    print("年龄: ", age)
    return


# 调用a函数
printInfo(age=10, name="小红")
print("------------------------")
printInfo(name="小明")

3.2 可变参数

所谓可变参数指的是在调用函数时,可以向函数传入0个或任意多个参数。

# 用星号表达式来表示stamp可以接收0个或任意多个参数
def printInfo(*stamp):

    # 可变参数可以放在for循环中取出每个参数的值
    for i in stamp:
        print(i)
    return


printInfo("一碗周")
printInfo(1, 2, 3, 4, 5, 6, 7)
printInfo("hello", "hi")

4、用模块管理函数

在同一个.py文件中如果有两个函数名是重名的,由于Python没有函数重载的概念,那么后面的定义会覆盖之前的定义,也就意味着两个函数同名函数实际上只有一个是存在的。这个时候模块的作用就体现出来了。

Python中的每个文件就代表了一个模块(module),在不同的模块中可以有同名的函数,在使用某个函数的时候可以通过import关键字引入指定的模块就可以区分每个函数了。

例:定义两个模块,分别为module1module2,然后测试引入流程

module1

def printinfo():
    print("这是第一个模块的printinfo函数")

module2

def printinfo():
    print("这是第二个模块的printinfo函数")

使用import关键字直接引入:

import module1
import module2
# 通过模块名加.函数名的方式引入
module1.printinfo()
module2.printinfo()

使用import...as关键字重命名引入:

import module1 as m1
import module2 as m2
# 可以通过重命名后的名字加.函数名的方式引入
m1.printinfo()
m2.printinfo()

使用from...import...as关键字重命名引入某个函数:

from module1 import printinfo as p1
from module2 import printinfo as p2
# 可以通过重命名后的名字加.函数名的方式引入
p1()
p2()

  • 值得注意的是:这里如果不使用as进行重命名的话,因为有两个printinfo就会导致错误,所以需要为其重命名

__name__ == '__main__'的用法
__name__Python中一个隐含的变量它代表了模块的名字,如果直接打印__name__,则出现__main__。

4.1 示例代码module.py

def printinfo():
    print("这是函数内的内容")

print(__name__)
print("这是模块函数外的内容")

输出结果:

# __main__
# 这是模块函数外的内容

如果将module.py作为模块引入则打印的结果为模块的名称(不带路径、扩展名)
示例代码

import module

输出结果:

module
这是模块函数外的内容

此时输出的结果就不一样了,简单来说:在module.py自己眼中name就是main,然而在别的文件眼中name就是module

module.py改造一下

def printinfo():
    print("这是函数内的内容")

printinfo()
if __name__=="__main__":
    print(__name__)
    print("这是模块函数外的内容")

输出结果:

这是函数内的内容
__main__
这是模块函数外的内容

当其他文件引入时

import module

输出结果:

这是函数内的内容

因为其他文件引入时不会执行模块中if条件成立时的代码 因为模块的名字是module而不是__main__

__name__ == '__main__'在实际场景中非常有用,一般在写模块的过程中肯定要进行测试,在导入的时候肯定不能将测试结果也打印出来,如果删除了,想要改进模块的时候又要重新写一遍,这个时候__name__ == '__main__'就派上了用场

5、变量的作用域

请看如下代码:

def test():
    b = "这是函数的变量"

    def test_nested():
        c = "这是嵌套的函数变量"
        print(a)
        print(b)
        print(c)
    test_nested()


if __name__ == "__main__":
    a = "这是全局作用域"
    test()

根据这段代码,来理解变量的作用域

此时在函数test_nested体内调用a,b,c三个函数都不会报出任何错误,

如果在函数体外调用b变量就会报出

print(b)
NameError: name 'b' is not defined

变量b未定义的错误,因为b属于局部变量,属于局部作用域,在函数体外是访问不到的

如果在test函数体内调用c则会报出

print(c)
NameError: name 'c' is not defined

变量c未定义的错误,因为c是在test_nested函数体内,对于test函数来说属于局部作用域,但是对于test函数内部的test_nested函数来说,变量b属于嵌套作用域,在test_nested函数中我们是可以访问到它的。

如果通过global来将b提升为全局变量,则在函数体外调用b变量就会正常打印

nonlocal关键字只能作用于局部变量,且始终找离当前最近的上层局部作用域中的变量

def outer():
    aa = 111

    def inner():
        nonlocal aa
        aa = 222
        print(aa)
    inner()
    print(aa)


outer()

如果没有这个nonlocal关键字则函数体inner打印222,函数体outer打印111,加上之后则直接打印两个222

Python查找一个变量时会按照“局部作用域”-->“嵌套作用域”-->“全局作用域”-->“内置作用域”的顺序进行搜索,所谓的“内置作用域”就是Python内置的那些标识符,之前用过的inputprintint等都属于内置作用域。

到此这篇关于Python函及模块的使用的文章就介绍到这了,更多相关Python函及模块使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解析PyCharm集成GitLab代码仓的问题

    解析PyCharm集成GitLab代码仓的问题

    这篇文章主要介绍了PyCharm集成GitLab代码仓的相关知识,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • Python爬虫实现爬取百度百科词条功能实例

    Python爬虫实现爬取百度百科词条功能实例

    这篇文章主要介绍了Python爬虫实现爬取百度百科词条功能,结合完整实例形式分析了Python爬虫的基本原理及爬取百度百科词条的步骤、网页下载、解析、数据输出等相关操作技巧,需要的朋友可以参考下
    2019-04-04
  • Django如何使用第三方服务发送电子邮件

    Django如何使用第三方服务发送电子邮件

    这篇文章主要介绍了Django如何使用第三方服务发送电子邮件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 跟老齐学Python之让人欢喜让人忧的迭代

    跟老齐学Python之让人欢喜让人忧的迭代

    跟一些比较牛X的程序员交流,经常听到他们嘴里冒出一个不标准的英文单词,而loop、iterate、traversal和recursion如果不在其内,总觉得他还不够牛X。当让,真正牛X的绝对不会这么说的,他们只是说“循环、迭代、遍历、递归”,然后再问“这个你懂吗?”。
    2014-10-10
  • Python入门_浅谈字符串的分片与索引、字符串的方法

    Python入门_浅谈字符串的分片与索引、字符串的方法

    下面小编就为大家带来一篇Python入门_浅谈字符串的分片与索引、字符串的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Python中的下划线详解

    Python中的下划线详解

    这篇文章主要介绍了Python中的下划线详解,本文讲解了单个下划线直接做变量名、单下划线前缀的名称、双下划线前缀的名称等内容,需要的朋友可以参考下
    2015-06-06
  • Python实现AI自动玩俄罗斯方块游戏

    Python实现AI自动玩俄罗斯方块游戏

    提到《俄罗斯方块》,那真是几乎无人不知无人不晓。其历史之悠久,可玩性之持久,能手轻轻一挥,吊打一大波游戏。本文将利用Python实现俄罗斯方块进阶版—AI自动玩俄罗斯方块,感兴趣的可以学习一下
    2022-03-03
  • Python Pandas条件筛选功能

    Python Pandas条件筛选功能

    这篇文章主要介绍了Python Pandas条件筛选功能,筛选是在平时的工作中使用非常频繁的功能了,下文详细的相关资料介绍,需要的小伙伴可以参考一下
    2022-03-03
  • pytorch 如何在GPU上训练

    pytorch 如何在GPU上训练

    这篇文章主要介绍了pytorch 如何在GPU上训练的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Python reflect单例模式反射各个函数

    Python reflect单例模式反射各个函数

    这篇文章主要介绍了Python reflect单例模式反射各个函数,文章围绕主题展开详细的内容介绍,具有一定的参考价值需要的小伙伴可以参考一下
    2022-06-06

最新评论