- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python函数及模块的使用由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
编程大师Martin Fowler先生曾经说过:“代码有很多种坏味道,重复是最坏的一种! ”.
可以将重复的功能封装到一个称之为“函数”的功能模块中,用来实现单一,或相关联功能的代码段.
定义函数的规则如下所示:
def
关键词开头,后接函数名和圆括号 () 。return
关键字用于退出函数,选择性地向调用方返回一个表达式。语法如下所示:
1
2
3
|
def
函数名(参数列表):
函数体
return
语句
|
1
2
3
4
5
6
7
8
9
10
|
# 定义一个函数 往里面穿两个参数
def
sum
(arg1, arg2):
# 返回2个参数的和."
total
=
arg1
+
arg2
return
total
# 调用sum函数
sumNum
=
sum
(
10
,
20
)
print
(sumNum)
/
/
30
|
除了定义函数和调用函数等基本操作之外,在函数中还可以使用参数。函数的参数简单的来说就是可以函数的函数体中使用的变量。与变量不同的是,这样的变量的是在函数体之前传递进去的.
调用函数时,如果没有传递参数,则会使用默认参数.
1
2
3
4
5
6
7
8
9
10
11
|
def
printInfo(name, age
=
12
):
"打印任何传入的字符串"
print
(
"名字: "
, name)
print
(
"年龄: "
, age)
return
# 调用a函数
printInfo(age
=
10
, name
=
"小红"
)
print
(
"------------------------"
)
printInfo(name
=
"小明"
)
|
所谓可变参数指的是在调用函数时,可以向函数传入0个或任意多个参数.
1
2
3
4
5
6
7
8
9
10
11
12
|
# 用星号表达式来表示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"
)
|
在同一个.py文件中如果有两个函数名是重名的,由于Python没有函数重载的概念,那么后面的定义会覆盖之前的定义,也就意味着两个函数同名函数实际上只有一个是存在的。这个时候模块的作用就体现出来了.
Python中的每个文件就代表了一个模块(module),在不同的模块中可以有同名的函数,在使用某个函数的时候可以通过import关键字引入指定的模块就可以区分每个函数了.
例:定义两个模块,分别为module1和module2,然后测试引入流程 。
module1 。
1
2
|
def
printinfo():
print
(
"这是第一个模块的printinfo函数"
)
|
module2 。
1
2
|
def
printinfo():
print
(
"这是第二个模块的printinfo函数"
)
|
使用import关键字直接引入:
1
2
3
4
5
|
import
module1
import
module2
# 通过模块名加.函数名的方式引入
module1.printinfo()
module2.printinfo()
|
使用import...as关键字重命名引入:
1
2
3
4
5
|
import
module1 as m1
import
module2 as m2
# 可以通过重命名后的名字加.函数名的方式引入
m1.printinfo()
m2.printinfo()
|
使用from...import...as关键字重命名引入某个函数:
1
2
3
4
5
|
from
module1
import
printinfo as p1
from
module2
import
printinfo as p2
# 可以通过重命名后的名字加.函数名的方式引入
p1()
p2()
|
printinfo
就会导致错误,所以需要为其重命名__name__ == '__main__'的用法 __name__是Python中一个隐含的变量它代表了模块的名字,如果直接打印__name__,则出现__main__.
1
2
3
4
5
|
def
printinfo():
print
(
"这是函数内的内容"
)
print
(__name__)
print
(
"这是模块函数外的内容"
)
|
输出结果:
1
2
|
# __main__
# 这是模块函数外的内容
|
如果将module.py作为模块引入则打印的结果为模块的名称(不带路径、扩展名) 示例代码 。
import module 。
输出结果:
module 这是模块函数外的内容 。
此时输出的结果就不一样了,简单来说:在module.py自己眼中name就是main,然而在别的文件眼中name就是module.
把module.py改造一下 。
1
2
3
4
5
6
7
|
def
printinfo():
print
(
"这是函数内的内容"
)
printinfo()
if
__name__
=
=
"__main__"
:
print
(__name__)
print
(
"这是模块函数外的内容"
)
|
输出结果:
这是函数内的内容 __main__ 这是模块函数外的内容 。
当其他文件引入时 。
import module 。
输出结果:
这是函数内的内容 。
因为其他文件引入时不会执行模块中if条件成立时的代码 因为模块的名字是module而不是__main__ 。
__name__ == '__main__'在实际场景中非常有用,一般在写模块的过程中肯定要进行测试,在导入的时候肯定不能将测试结果也打印出来,如果删除了,想要改进模块的时候又要重新写一遍,这个时候__name__ == '__main__'就派上了用场 。
请看如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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变量就会报出 。
1
2
|
print
(b)
NameError: name
'b'
is
not
defined
|
变量b未定义的错误,因为b属于局部变量,属于局部作用域,在函数体外是访问不到的 。
如果在test函数体内调用c则会报出 。
1
2
|
print
(c)
NameError: name
'c'
is
not
defined
|
变量c未定义的错误,因为c是在test_nested函数体内,对于test函数来说属于局部作用域,但是对于test函数内部的test_nested函数来说,变量b属于嵌套作用域,在test_nested函数中我们是可以访问到它的.
如果通过global来将b提升为全局变量,则在函数体外调用b变量就会正常打印 。
nonlocal关键字只能作用于局部变量,且始终找离当前最近的上层局部作用域中的变量 。
1
2
3
4
5
6
7
8
9
10
11
12
|
def
outer():
aa
=
111
def
inner():
nonlocal aa
aa
=
222
print
(aa)
inner()
print
(aa)
outer()
|
如果没有这个nonlocal关键字则函数体inner打印222,函数体outer打印111,加上之后则直接打印两个222 。
Python查找一个变量时会按照“局部作用域”-->“嵌套作用域”-->“全局作用域”-->“内置作用域”的顺序进行搜索,所谓的“内置作用域”就是Python内置的那些标识符,之前用过的input、print、int等都属于内置作用域.
到此这篇关于Python函及模块的使用的文章就介绍到这了,更多相关Python函及模块使用内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://juejin.cn/post/7022961430160736292 。
最后此篇关于Python函数及模块的使用的文章就讲到这里了,如果你想了解更多关于Python函数及模块的使用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我最近在我的机器上安装了 cx_Oracle 模块,以便连接到远程 Oracle 数据库服务器。 (我身边没有 Oracle 客户端)。 Python:版本 2.7 x86 Oracle:版本 11.
我想从 python timeit 模块检查打印以下内容需要多少时间,如何打印, import timeit x = [x for x in range(10000)] timeit.timeit("
我盯着 vs 代码编辑器上的 java 脚本编码,当我尝试将外部模块包含到我的项目中时,代码编辑器提出了这样的建议 -->(文件是 CommonJS 模块;它可能会转换为 ES6 模块。 )..有什么
我有一个 Node 应用程序,我想在标准 ES6 模块格式中使用(即 "type": "module" in the package.json ,并始终使用 import 和 export)而不转译为
我正在学习将 BlueprintJS 合并到我的 React 网络应用程序中,并且在加载某些 CSS 模块时遇到了很多麻烦。 我已经安装了 npm install @blueprintjs/core和
我需要重构一堆具有这样的调用的文件 define(['module1','module2','module3' etc...], function(a, b, c etc...) { //bun
我是 Angular 的新手,正在学习各种教程(Codecademy、thinkster.io 等),并且已经看到了声明应用程序容器的两种方法。首先: var app = angular.module
我正在尝试将 OUnit 与 OCaml 一起使用。 单元代码源码(unit.ml)如下: open OUnit let empty_list = [] let list_a = [1;2;3] le
我在 Angular 1.x 应用程序中使用 webpack 和 ES6 模块。在我设置的 webpack.config 中: resolve: { alias: { 'angular':
internal/modules/cjs/loader.js:750 return process.dlopen(module, path.toNamespacedPath(filename));
在本教程中,您将借助示例了解 JavaScript 中的模块。 随着我们的程序变得越来越大,它可能包含许多行代码。您可以使用模块根据功能将代码分隔在单独的文件中,而不是将所有内容都放在一个文件
我想知道是否可以将此代码更改为仅调用 MyModule.RED 而不是 MyModule.COLORS.RED。我尝试将 mod 设置为变量来存储颜色,但似乎不起作用。难道是我方法不对? (funct
我有以下代码。它是一个 JavaScript 模块。 (function() { // Object var Cahootsy; Cahootsy = { hello:
关闭。这个问题是 opinion-based 。它目前不接受答案。 想要改进这个问题?更新问题,以便 editing this post 可以用事实和引文来回答它。 关闭 2 年前。 Improve
从用户的角度来看,一个模块能够通过 require 加载并返回一个 table,模块导出的接口都被定义在此 table 中(此 table 被作为一个 namespace)。所有的标准库都是模块。标
Ruby的模块非常类似类,除了: 模块不可以有实体 模块不可以有子类 模块由module...end定义. 实际上...模块的'模块类'是'类的类'这个类的父类.搞懂了吗?不懂?让我们继续看
我有一个脚本,它从 CLI 获取 3 个输入变量并将其分别插入到 3 个变量: GetOptions("old_path=s" => \$old_path, "var=s" =
我有一个简单的 python 包,其目录结构如下: wibble | |-----foo | |----ping.py | |-----bar | |----pong.py 简单的
这种语法会非常有用——这不起作用有什么原因吗?谢谢! module Foo = { let bar: string = "bar" }; let bar = Foo.bar; /* works *
我想运行一个命令: - name: install pip shell: "python {"changed": true, "cmd": "python <(curl https://boot
我是一名优秀的程序员,十分优秀!