python函数

函数定义

def welcome():
print('hello world!!')
welcome() #函数调用 ...运行结果 hello world!!

函数定义和编写原则:

  1. 尽量一个动作一个函数,以减少函数之间的耦合性;

函数传参

实参和形参

位置实参:函数调用时,每个形参都有一个实参(值)与之关联对应,最简单的关联方式是基于实参的顺序。

def num (a,b):  #a,b为形参
print(a)
print(b)
print(a +b)
num(1,2) #1,2为实参 ...运行结果 1
2
3

关键字实参:给函数以名称-值对的方式关联形参。

def num (a,b):
print(a)
print(b)
print(a +b)
num(b=1,a=2) ...运行结果 2
1
3

默认值:编写函数时可以给形参指定默认值,如果没有实参与之关联实用默认值,有实参与之关联,使用实参值。

def num (a,b=1):
print(a)
print(b)
print(a +b)
num(1,) ...运行结果 1
1
2
def num (a,b=1):
print(a)
print(b)
print(a +b)
num(1,2) ...运行结果 1
2
3

不定长参数(*args )

在定义函数时可以在函数的形参前头加一个*,这样的形参可以获取到所有的实参,它会将所有的实参保存到一个元组中;即*a会接受所有的位置实参,并将这些实参统一保存到一个元组中。

*a 不一定必须放在最后面,但是*a后面的形参传参必须用关键字参数

*a 只能接受位置实参,不能接受关键字实参

实例:

def name_list(company,*names):
print('%s公司人员名单:'%company)
for name in names:
print(name)
name_list('老k天下','张三','李四','王二') ...................................运行结果 老k天下公司人员名单:
张三
李四
王二

讲解:

上述函数python将收到的第一个值传给company,并将其他所有值储存在元组names中。

不定长参数(**kwargs)

**形参可以接受其他关键字参数,它会将这些参数统一保存到一个字典中,字典的key就是参数的名字,字典的value就是参数的值

**形参只能有一个,且只能写在所有形参的最后面

实例:

def build_file(name,**name_info):
namefile = {}
namefile['name'] = name
for key,value in name_info.items():
namefile[key] = value
return namefile user_file = build_file('sb',
age = 28,
high = 180)
print(user_file) .....................................运行结果 {'name': 'sb', 'age': 28, 'high': 180}

讲解:

形参name_info中的两个让python创建一个名为name_info的空字典,并将收到的所有名称-值都封装在这个字典中。

参数的解包(拆包)

def fn4(a,b,c):
print('a =',a)
print('b =',b)
print('c =',c) # 创建一个元组
t = (10,20,30) # 传递实参时,也可以在序列类型的参数前添加星号,这样他会自动将序列中的元素依次作为参数传递
# 这里要求序列中元素的个数必须和形参的个数的一致
# fn4(*t) # 创建一个字典
d = {'a':100,'b':200,'c':300}
# 通过 **来对一个字典进行解包操作
fn4(**d)

return

函数返回值

比较实例1:

def num (a=1,b=2):
print(a +b)
print(num()) ...运行结果 3
None

比较实例2:

def num (a=1,b=2):
print(a +b)
return a+b
print(num()) ...运行结果 3
3

实例

统计cpu memory disk 使用情况:

import psutil

def cpu():
cpu = psutil.cpu_percent(1)
return {'cpu_percent': cpu} def mem():
mem_total = psutil.virtual_memory()[0]
mem_percent = psutil.virtual_memory()[2]
return {'mem_total':int(mem_total/1024/1024),'mem_percent': mem_percent} def disk():
disk_total = psutil.disk_usage('c:')[0]
disk_percent = psutil.disk_usage('c:')[3]
return {'disk_total': int(disk_total/1024/1024/1024), 'disk_percent': disk_percent} def main():
info = {}
info.update(cpu())
info.update(mem())
info.update(disk()) msg = '''
cpu使用率:%s%%
内存使用率:%s%%
硬盘使用率:%s%%
==============
内存总大小:%sM
硬盘总打小:%sG
''' % (info['cpu_percent'],info['mem_percent'],info['disk_percent'],info['mem_total'],info['disk_total'])
return msg if __name__ == '__main__':
print(main()) .........................................................运行结果 cpu使用率:7.8%
内存使用率:42.3%
硬盘使用率:30.4%
==============
内存总大小:8070M
硬盘总打小:69G

拓展:名称空间与作用域

命名空间指的是变量存储的位置,每一个变量都需要存储到指定的命名空间当中

每一个作用域都会有一个它对应的命名空间

全局命名空间,用来保存全局变量。函数命名空间用来保存函数中的变量

命名空间实际上就是一个字典,是一个专门用来存储变量的字典

内置名称空间:(python启动时就有)python解释器内置的名字,print,max,min

全局名称空间:(执行python文件时启动)定投定义的变量

局部名称空间:(调用函数时启动,调用结束失效)函数内部定义的变量

加载顺序:内置--->全局--->局部

访问顺序:局部--->全局--->内置

def func1():
def func2():
def func3():
print(print)
func3()
func2()
func1()
-------------------------------------------------------------------------------------------------
# locals()用来获取当前作用域的命名空间
# 如果在全局作用域中调用locals()则获取全局命名空间,如果在函数作用域中调用locals()则获取函数命名空间
# 返回的是一个字典
scope = locals() # 当前命名空间
print(type(scope))
# print(a)
# print(scope['a'])
# 向scope中添加一个key-value
scope['c'] = 1000 # 向字典中添加key-value就相当于在全局中创建了一个变量(一般不建议这么做)
# print(c) def fn4():
a = 10
# scope = locals() # 在函数内部调用locals()会获取到函数的命名空间
# scope['b'] = 20 # 可以通过scope来操作函数的命名空间,但是也是不建议这么做 # globals() 函数可以用来在任意位置获取全局命名空间
global_scope = globals()
# print(global_scope['a'])
global_scope['a'] = 30
# print(scope) fn4()

在Python中一共有两种作用域

全局作用域

  • 全局作用域在程序执行时创建,在程序执行结束时销毁
  • 所有函数以外的区域都是全局作用域
  • 在全局作用域中定义的变量,都属于全局变量,全局变量可以在程序的任意位置被访问

函数作用域

  • 函数作用域在函数调用时创建,在调用结束时销毁
  • 函数每调用一次就会产生一个新的函数作用域
  • 在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问

变量的查找

  • 当我们使用变量时,会优先在当前作用域中寻找该变量,如果有则使用,

    如果没有则继续去上一级作用域中寻找,如果有则使用,

    如果依然没有则继续去上一级作用域中寻找,以此类推

    直到找到全局作用域,依然没有找到,则会抛出异常

    NameError: name 'a' is not defined
def fn2():
def fn3():
print('fn3中:','a =',a)
fn3() # fn2() a = 20 def fn3():
# a = 10 # 在函数中为变量赋值时,默认都是为局部变量赋值
# 如果希望在函数内部修改全局变量,则需要使用global关键字,来声明变量
global a # 声明在函数内部的使用a是全局变量,此时再去修改a时,就是在修改全局的a
a = 10 # 修改全局变量
print('函数内部:','a =',a) # fn3()
# print('函数外部:','a =',a)

拓展:匿名函数:lambda

lambda函数:自带return

#语法: lambda 参数:返回值

res=(lambda x,y:x+y)(1,2)
print(res)

拓展:内置函数:max, sorted, map, filter

powerinfo = {
'大娃': 40000,
'二娃':30000,
'三娃': 25000,
'蛤蟆精': 2000
}

max:取最大

def func(k):
return powerinfo[k]
res = max(powerinfo,key=lambda k: powerinfo[k])
print(res)

sorted:排序

# sorted()为内置函数,可以对任意序列进行排序
# sorted()并不影响原来的对象,而是返回一个新的对象
# sorted()可以接受一个关键字参数 key
# key需要一个函数作为参数 res = sorted(powerinfo,key=lambda k:powerinfo[k])
print(res)

map:映射

names = ['大娃', '二娃', '三娃']
res = map(lambda i: i % name,names)
#或
res = map(lambda name: '%s_会武功' % name,names)
print(list(res))

zip:拉链

l1 = [1,2,3]
l2 = ['a','b','c','d']
res = zip(l1,l2)
print(list(res))

filter:过滤

names = ['大娃_会武功', '二娃_会武功', '三娃_会武功','蛤蟆精']

res = filter(lambda name: name.endswith('会武功'),names)
print(list(res))

拓展:闭包

当有一些见不得人的东西需要隐藏的时候(需要设定变量,只有本函数可以调用),我们可以用到闭包。

闭包的形成条件:

  • 函数嵌套
  • 将内部函数作为返回值返回
  • 内部函数必须要使用到外部函数的变量
def make_averager():
#创建一个表用来保存数
nums = []
#创建一个函数用来计算平均值
def averager(int(n)):
nums.append(n)
return sun(nums)/len(nums)
return averager() print(make_averager(10))
print(make_averager(10))
print(make_averager(10))
nums = [] #对求名平均值没有影响,因为用了闭包,命名空间不同,不是同一个对象
print(make_averager(10))

python--函数、参数、名称空间与作用域、匿名函数、内置函数、闭包的更多相关文章

  1. python之三元表达式与生成式与匿名与内置函数(部分)

    目录 三元表达式 各种生成式 列表生成式(可同样作用于集合) 字典生成式 匿名函数 重要内置函数 map() zip() filter() reduce() 常见内置函数(部分) 三元表达式 三元表达 ...

  2. Python 函数对象-函数嵌套-名称空间与作用域-闭包函数

    今日内容: 1. 函数对象 函数是第一类对象: 指的是函数名指向的值可以被当中数据去使用 1.可以被引用 2.可以当做参数传给另一个函数 3.可以当做一个函数的返回值 4.可以当做容器类型的元素 2. ...

  3. python 函数的名称空间及作用域

    一:名称空间 1:什么是名称空间: 名称空间即:储存名字与值的内存地址关联关系的空间 2.名称空间的分类: 内置名称空间:存储器自带的一些名称与值的对应关系,如:print,len,max等; 生命周 ...

  4. day_12函数默认值,数据类型的补充,函数对象名称空间与作用域,函数的嵌套定义

    复习, 昨天讲了字符串的比较,按照从左往右比较每一个字符,通过字符对应的ASCII码进行比较 函数的参数,‘ 实参与形参 形参:在函数定义时()中出现的参数 实参,在函数调用时()中出现的参数 实参的 ...

  5. python基础12_匿名_内置函数

    一个二分查找的示例: # 二分查找 示例 data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35, 36, ...

  6. python基础之函数参数,名称空间,以及函数嵌套

    函数进阶内容梗概: 1. 函数参数--动态传参 2. 名称空间, 局部名称空间, 全局名称空间, 作⽤用域, 加载顺序. 3. 函数的嵌套 4. gloabal , nonlocal 关键字 1. 函 ...

  7. Python——day14 三目运算、推导式、递归、匿名、内置函数

    一.三目(元)运算符 定义:就是 if...else...语法糖前提:简化if...else...结构,且两个分支有且只有一条语句注:三元运算符的结果不一定要与条件直接性关系​ cmd = input ...

  8. day16_函数作用域_匿名函数_函数式编程_map_reduce_filter_(部分)内置函数

    20180729    补充部分代码 20180727    上传代码 #!/usr/bin/env python # -*- coding:utf-8 -*- # ***************** ...

  9. python基础:函数传参、全局变量、局部变量、内置函数、匿名函数、递归、os模块、time模块

    ---恢复内容开始--- 一.函数相关: 1.1位置参数: ef hello(name,sex,county='china'): pass #hello('hh','nv') #位置参数.默认参数 1 ...

  10. python基础之递归,匿名,内置函数

    递归函数: 什么是递归函数? 函数递归调用:在调用一个函数的过程中,又直接或间接地调用了该函数本身. 递归必须要有两个明确的阶段: ①递推:一层一层递归调用下去,强调:每进入下一层问题规模减少 ②回溯 ...

随机推荐

  1. 【机制】JavaScript的原型、原型链、继承

    1.原型和原型链的概念 js在创建一个对象时,比如叫 obj,都会给他偷偷的加上一个引用,这个引用指向的是一个对象,比如叫 yuanxing, 这个对象可以给引用它的对象提供属性共享,比如:yuanx ...

  2. 论文阅读 Characterization of Multiple 3D LiDARs for Localization and Mapping using Normal Distributions Transform

    Abstract 在这个文章里, 我们细致的比较了10种不同的3D LiDAR传感器, 用了一般的 Normal Distributions Transform (NDT) 算法. 我们按以下几个任务 ...

  3. java内部类笔记

    内部类 1.   普通内部类 <pre name="code" class="java">class className{ [private|pro ...

  4. 多图详解Go中的Channel源码

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的go的源码时14.4 chan介绍 package main import & ...

  5. ArrayDeque API 与算法分析

    ArrayDeque 是双端队列的动态数组实现,可以当作栈和队列来使用.作为栈时,它的效率比 Stack 更高,作为队列时,效率比 LinkedList 更高.ArrayDeque 大部分操作的时间复 ...

  6. new ArrayList(0) 和 new ArrayList() 和一样吗?

    第一感觉是一样的,盲猜后者调用了前者,并传入参数 0.然而,无论是 JDK 7 还是 JDK 8,这两个方法构造的结果都是不一样的.JDK 开发人员在这方面作了优化. JDK 7 在 Java 7 中 ...

  7. Docker踩过的坑

    前言 主要是记录Docker遇到的坑,更多的是因为自己的粗心大意,以此警示 正文 Dockerfile里的RUN 某一次把启动服务的命令写在了 Dockerfile 中,后来发现服务一直拉不起来. 原 ...

  8. maven 报的一堆错

    今天初学maven,刚开始下载的是Apache-maven-3.6.2然后配置运行一个servlet,但是在pom.xml中写jar包坐标时一直报错显示红色,本地仓库和官网上的中央仓库都试过了就是依赖 ...

  9. 用js实现打印九九乘法表

    用js在打印九九乘法表 思考 在学习了流程控制和条件判断后,我们可以利用js打印各式各样的九九乘法表 不管是打印什么样三角形九九乘法表,我们都应该找到有规律的地方,比如第一列的数字是什么规律,第一行的 ...

  10. os-hackos-3-docker提权

    0x00 cewl http://192.168.43.179/websec/爬取页面所有的单词做成字典 hydra -l contact@hacknos.com -P cewl.txt 192.16 ...