python的程序由包(package)、模块(module)和函数组成。模块是处理某一类问题的集合,模块由函数和类组成,包是由一系列模块组成的集合。包必须至少包含一个__init__.py文件,该文件内容可以为空,它用于标识文件夹是一个包。

1. 模块

  模块是把一组相关的函数或代码组织到一个文件中,一个文件即是一个模块,模块由代码、函数或类组成。

1.1 模块的创建

##########myModule.py文件##########
#自定义模块
def func():
print('myModule.func()') class MyClass:
def Func(self):
print('myModule.MyClass.Func()') ###########call_myModule.py文件#########
import myModule #导入模块 myModule.func() #调用模块的函数
myClass = myModule.MyClass() #调用模块的类
myClass.Func() #调用模块的类的方法

  myModule.py和call_myModule.py必须放在同一个目录下,或放在sys.path所列车的目录下,否则python解释器找不到自定义的模块。当python导入一个模块时,python首先查找当前路径,然后查找lib目录,site-packages目录和环境变量PATHONPATH设置的目录。如果导入的模块没有找到,在以上路径搜索一下是否含有这个模块。

1.2 模块的导入

  • 导入模块:调用模块的函数或类,需要以模块名作为前缀。如:模块名.func()
import 模块名
  • 导入模块的函数:这样调用不需要以模块名作为前缀。如:func()
from 模块名 import 函数名
  • 导入模块下所有的类和函数:
from 模块名 import *

  同一个模块支持多条import语句。

##########module_count.py##########
count = 0
def func():
global count
count += 1
return count ##########call_module_count.py##########
import module_count
print(module_count.func()) #1
import module_count
print(module_count.func()) #2

  python的import可以置于程序中任意位置,甚至放在条件语句中。

#修改上面代码如下
##########call_module_count.py##########
import module_count
print(module_count.func()) #1
import module_count
print(module_count.func()) #2 if module_count.count >0:
module_count.count=0
else:
import module_count
print(module_count.count) #0

1.3 模块的属性 

   模块有一些内置属性,如__name__、__doc__。__name__用于判断当前模块是否是程序的入口,如果当前程序正在被使用,__name__的值为"__main__"。通常给每个模块都添加一个条件语句,用于单独测试该模块的功能。

##########module.py##########

'''测试模块的__name__属性'''
if __name__ == "__main__":
print("模块作为主程序运行!!")
else:
print("模块被另一个程序调用!!!") '''
运行此模块结果:
模块作为主程序运行!!
'''

  导入以上模块运行测试:

##########module_call.py##########

import module
print(module.__doc__) '''
模块被另一个程序调用!!!
测试模块的__name__属性
'''

2. 函数

  函数是一段可以重复多次调用的代码,通过输入的参数值返回需要的结果,return如果不写,会被隐式加上,返回值为None。return的返回值可以是任意对象,如果输出多个,则以元组的形式返回。

2.1 函数的定义

def 函数名(参数1,参数2...):
函数主体...
return 返回值

函数定义与调用:

def count(x,y):     #函数定义
res = x+y #函数主体
return res #返回值 ret = count(3,5) #函数调用
print(ret)

2.2 函数的参数

  形式参数:函数()里的参数
  实际参数:调用函数()里传入的参数
  python中一切皆对象,所以参数只支持引用传递的方式。python通过名称绑定的机制,把实际参数的值和形式参数的名称绑定在一起。即把形式参数传递到函数所在的局部命名空间中,形式参数和实际参数指向内存中同一个存储空间。

  • 位置参数:实际参数与形式参数一一对应。
def count(x,y):
print(x,y) count(1,2) #1 2
count(2,1) #2 1
  • 默认参数:
def count(x,y=5):
res = x+y
return res print(count(2)) #7
print(count(2,3)) #5

特殊情况:由于参数实现了名称绑定机制,在使用默认参数时,可能会特殊情况。

def append(args=[]):
args.append(0)
print(args) append() #[0]
append([1]) #[1,0]
append() #[0,0],此时使用的列表还是第一次调用的args,因此在原有基础上再追加一个元素0。 '''
args:[]
id(args):-->4363806792
[0] args:[1]
id(args):-->4363805384
[1, 0] args:[0]
id(args):-->4363805384
[0, 0]
'''

修改以上函数:

def append(args=[]):
if len(args)==0:
args = []
args.append(0)
print(args) append() #[0]
append([1]) #[1,0]
append() #[0]
  • 关键参数:关键参数必须放在位置参数之后。
def count(x,y,z):
print(x,y,z) count(2,y=3,z=6) #2 3 6
count(1,z=3,y=2) #1 2 3
# count(z=1,2,3) #错误,SyntaxError: positional argument follows keyword argument
  • 可变长度参数:

  *args:会把传入的参数变成一个元组形式
  **kwargs:会把传入参数变成一个字典形式
  *必须写在**的前面

def count(*args):
print(args) #(1, 'a', [1, 2, 3], {'name': 'zhangsan'})
print(type(args)) #<class 'tuple'> count(1,'a',[1,2,3],{'name':'zhangsan'}) def info(**kargs):
print(kargs) #{'name': 'zhangsan', 'age': 18, 'score': 'A'}
print(type(kargs)) #<class 'dict'> info(name='zhangsan',age=18,score='A')
  • 高阶函数

  一个函数的参数为另一个函数。

def func(x):
return x*2 def func2(x,y,f):
return f(x) + f(y) print(func2(3,2,func)) #10

2.3 嵌套函数

  嵌套函数就是指在函数的内部调用其他函数。函数的嵌套层数不宜过多,会造成代码的可读性差、不易维护等问题。一般函数的嵌套调用应控制在3层以内。

  • 函数嵌套:
def sum(x,y):
return x+y
def sub(x,y):
return x-y
def func(x,y):
return sum(x,y)*sub(x,y) print(func(5,2))
  • 函数内部定义函数:
def func():
x = 5
y = 2
m = 3
n = 1
def sum(a,b):
return a+b
def sub(a,b):
return a-b
return sum(x,y)*sub(m,n) print(func())
  • 内部函数引用外部函数的变量:
def func():
x = 5
y = 2
m = 3
n = 1
def sum():
return x+y
def sub():
return m-n
return sum()*sub() print(func())

2.4 递归函数

  递归函数可以在函数主体内直接或间接地调用自己,即函数的嵌套是函数本身。递归是一种程序设计方法,使用递归可以减少重复的代码,使程序变得简洁。
  递归分为两个阶段:递推和回归。
  第一阶段:递归函数在内部调用自己。每一次函数调用又重新开始执行此函数的代码,直到某一级递归程序结束。
  第二阶段:递归函数从后往前返回。递归函数从最后一级开始返回,一直返回到第一次调用的函数体内。即递归逐级调用完毕后,再按照相反的顺序逐级返回。
  递归函数需要编写递归结束的条件,否则就是死循环,一般通过判断语句来结束程序。

计算阶乘:

def func(n):
i=0
if n>1:
i=n
n *= func(n-1)
print('%s的阶乘:%s'%(i,n))
return n
func(5) '''
2的阶乘:2
3的阶乘:6
4的阶乘:24
5的阶乘:120
'''

2.5 lambda函数

  lambda函数用于创建一个匿名函数,函数名和标识符进行绑定。使用lambda函数可以返回一些简单的运算结果。的lambda也成为表达式,lambda中只能使用表达式,不能使用判断、循环等多重语句。

格式:通常把lambda赋值给一个变量

#赋值
func = lambda 变量1,变量2...:表达式
#调用
func()

  这样就把lambda和变量func绑定在一起了,变量func的名称就是函数名。lambda函数可以消除内部函数。

def func():
x = 1
y = 2
m = 3
n = 4
sum = lambda x,y:x+y
print(sum)
sub = lambda m,n:m-n
print(sub)
return sum(x,y) * sub(m,n) print(func())

  

2.6 Generator函数

  生成器(Generator)的作用是一次产生一个数据项,并把数据项输出。Generator函数可以用在for循环中遍历。Generator函数每次返回一个数据项的特性,使得迭代器的性能更佳。

格式:

def 函数名(参数列表):
...
yield 表达式

  Generator在函数体内使用yield生成数据项,可以被for循环遍历,并可以通过next()方法获得yield生成的数据项。

def func(n):
for i in range(n):
yield i
r = func(3)
#使用__next__方法输出
print(r.__next__())
print(r.__next__())
print(r.__next__())
# print(r.__next__()) #报错:StopIteration #类似for循环
for i in range(3):
print(i)

yiled与return的返回值和执行原理不同。
yield生成值并不会中止程序的执行,返回值后程序继续往后执行。
return返回值后,程序将中止执行。

#yield与return区别
def func(n):
for i in range(n):
return i def func2(n):
for i in range(n):
yield i print('#return演示:%s'%func(3)) #0
r = func2(3)
print('yield演示:')
print(r.__next__()) #0
print(r.__next__()) #1
print(r.__next__()) #2

  Generator函数每次只返回一个数据项,占用更少的内存。每次生成的数据都要记录当前的状态,便于下一次生成数据。数据的访问是通过next()方法实现。当访问越界时会抛出StopIten异常。
  当程序需要较高的性能或一次只需一个值进行处理时,使用Generator函数。

  

Python模块与函数的更多相关文章

  1. Python模块和函数

    目录 一.基础 二.特殊函数 一.基础 #导入模块 import xxx #调用 xxx.dd() from xxx import xx  as dd #导入某个函数,as给函数加别名,调用xx() ...

  2. 嵌入Python | 调用Python模块中有参数的函数

    开发环境Python版本:3.6.4 (32-bit)编辑器:Visual Studio CodeC++环境:Visual Studio 2013 需求说明前一篇<在C++中嵌入Python|调 ...

  3. 嵌入Python系列 | 调用Python模块中无参数函数

    开发环境 Python版本:3.6.4 (32-bit) 编辑器:Visual Studio Code C++环境:Visual Studio 2013 需求说明 在用VS2013编写的Win32程序 ...

  4. Python第十一天 异常处理 glob模块和shlex模块 打开外部程序和subprocess模块 subprocess类 Pipe管道 operator模块 sorted函数 os模块 hashlib模块 platform模块 csv模块

    Python第十一天    异常处理  glob模块和shlex模块    打开外部程序和subprocess模块  subprocess类  Pipe管道  operator模块   sorted函 ...

  5. 自学Python之路-Python基础+模块+面向对象+函数

    自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python    1.1 自学Python1.1-简介    1.2 自学Python1.2-环境的 ...

  6. python inspect 模块 和 types 模块 判断是否是方法,模块,函数等内置特殊属性

    python inspect 模块 和 types 模块 判断是否是方法,模块,函数等内置特殊属性 inspect import inspect def fun(): pass inspect.ism ...

  7. 嵌入Python | 调用Python模块中无参数的函数

    开发环境 Python版本:3.6.4 (32-bit) 编辑器:Visual Studio Code C++环境:Visual Studio 2013 需求说明 在用VS2013编写的Win32程序 ...

  8. python学习笔记十——模块与函数

    第五章 模块与函数 5.1 python程序的结构 函数+类->模块              模块+模块->包                 函数+类+模块+包=Python pyth ...

  9. python协程函数、递归、匿名函数与内置函数使用、模块与包

    目录: 协程函数(yield生成器用法二) 面向过程编程 递归 匿名函数与内置函数的使用 模块 包 常用标准模块之re(正则表达式) 一.协程函数(yield生成器用法二) 1.生成器的语句形式 a. ...

随机推荐

  1. day_07 深浅拷贝

    1. 基础数据类型的补充 1字符串的操作: 1.join 把字符串或者列表的的内拼接,拼接成字符串 和split相反--把字符串转换成列表 2.删除 字典和列表在循环中是不能进行删除的,可以在循环中把 ...

  2. linux输入输出及vim管理

    一.理解系统的输入输出 输入输出系统是计算机重要组成部分,是沟通计算机与外界的桥梁. 二.管理输入输出的符号 1.输出重定向 >                       ##重定向正确输出 ...

  3. eclipse.ini X64 Oxygen.2 Release (4.7.2) lombok

    X64 Eclipse Java EE IDE for Web Developers. Version: Oxygen.2 Release (4.7.2)Build id: 20171218-0600 ...

  4. 1.5 GO json转Map

    使用GO将show slave status查询返回的json串转为Map类型 package main import ( "encoding/json" "fmt&qu ...

  5. vue环境搭建(一)

    1.Vue依赖node npm命令执行,需要下载node 下载地址 2.安装全局vue-cli脚手架(搭建环境所需要模板),  window+ r 打开命令工具,输入cmd  ,这时显示命令行工具,输 ...

  6. 关于JAVA的基本知识

    TCP/IP 协议族常用协议 应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等 传输层:TCP,UDP 网络层:IP,ICMP,OSPF,EIGRP,IGMP 数据链 ...

  7. keil版本控制

    keil5.15才有对git svn的支持,之前的有其它的svcs;   http://www.keil.com/appnotes/files/apnt_279.pdf http://stdbit.c ...

  8. F. Cooking Time 贪心

    http://codeforces.com/gym/101498/problem/F 对于知道使用情况的置换算法,最优解是找一个最后需要使用的物品替换掉 也就是,如果一个物品后面已经不需要用到,就要拿 ...

  9. UGUI 哪些显示在前方的问题

    1.对于一个场景里不同的Canvas来说,越最后创建的或者越最后激活的Canvas,越显示在前方. 2.对于同一个Canvas里的UI来说在Hierarchy面板越靠下越显示在前方.

  10. Java基础07-随机数

    第一种方法:导入java.util.Random; import java.util.Random; public class Test1{ public static void main(Strin ...