Day9 Python基础之函数基础(七)
参考链接:https://www.cnblogs.com/yuanchenqi/articles/5828233.html
1.函数的定义
定义:
函数是指将一组语句的集合通过一个函数名封装起来,要想执行该函数,只需调用其函数名即可
特性:
1.代码重用(减少重复代码)
2.保持代码的一致性
3.可扩展性(方便修改)
2.函数的创建
格式
Python 定义函数使用 def 关键字,一般格式如下:
def 函数名(参数列表):
函数体
函数名的命名规则
和变量命名规则一致
形参和实参
形参:形式参数,不是实际存在,是虚拟变量。在定义函数和函数体的时候使用形参,
目的是在函数调用时接收实参(实参个数,类型应与实参一一对应)
实参:实际参数,调用函数时传给函数的参数,可以是常量,变量,表达式,函数,传给形参
区别:形参是虚拟的,不占用内存空间,.形参变量只有在被调用时才分配内存单元,实参是一个变量,
占用内存空间,数据传送单向,实参传给形参,不能形参传给实参
函数的参数
- 必备参数:必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样
关键字参数:函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致,
因为 Python 解释器能够用参数名匹配参数值。
- 默认参数(缺省参数):调用函数时,缺省参数的值如果没有传入,则被认为是默认值(在定义函数时已赋值)。
def print_info(name,age,sex='female'):
print('name:%s\nage:%i\nsex:%s'%(name,int(age),sex))
print_info(age=24,name='venus',sex='male')
输出结果:
name:venus
age:24
sex:male
print_info(age=24,name='venus')
输出结果:
name:venus
age:24
sex:female
关键字参数、默认参数
注:默认参数一定要跟在其它参数后面
不定长参数 :你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。
加了星号(*)的变量名会存放所有未命名的变量参数(元组)
def senior_add(*args):
sum=0
for i in args:
sum+=i
print(args)
print(type(args))
print(sum) senior_add(1,2,3,4,5,6,7)
输出结果:
(1, 2, 3, 4, 5, 6, 7)
<class 'tuple'>
28
*
加(**)的变量名会存放命名的变量参数(字典)
def print_info(**kwargs):
print(type(kwargs))
for i in kwargs:
print('%s:%s'%(i,kwargs[i])) print_info(age=24,name='venus',sex='male')
print_info(age=24,name='venus',job='IT') 输出结果:
<class 'dict'>
age:24
name:venus
sex:male
<class 'dict'>
age:24
name:venus
job:IT
**
注:(1)一定要注意*args和*kwargs的位置关系:保证 *args在*kwargs的前面,即(*args,*kwargs),传实参时也要遵照此原则
(2)形参优先级:关键字参数,默认参数,不定长未命名参数,不定长命名参数,即(name,age=22,*args,*kwargs)
很重要的传参方式
def f(*args):
print(type(args))
print(args)
f([1,2,3])
f(*[1,2,3]) 输出结果
<class 'tuple'>
([1, 2, 3],)
<class 'tuple'>
(1, 2, 3)
f(*list)
def f(**kwargs):
print(type(kwargs))
print(kwargs) f({'name':'venus'})
f(info={'name':'venus'})
f(**{'name':'venus'}) # 输出结果
报错 <class 'dict'>
{'info': {'name': 'venus'}} <class 'dict'>
{'name': 'venus'}
f(**dict)
- 补充高阶函数
def f1(n):
return n**2
def f2(n):
return n*2
def ff(a,b,func):
return func(a)+func(b) print(ff(2,3,f1))
print(ff(2,3,f2)) 输出结果:
13
10
高阶函数
函数的返回值
要想获取函数的执行结果,就可以用return语句把结果返回
注意:
- 函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束
- 如果未在函数中指定return,那这个函数的返回值为None
- return多个对象,解释器会把这多个对象组装成一个元组作为一个一个整体结果输出。
作用域!!!
作用域介绍:python中的作用域分4种情况:L、E、G、B
L:local,局部作用域,即函数中定义的变量;
E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
G:global,全局变量,就是模块级别定义的变量;
B:built-in,系统固定模块里面的变量,比如int, bytearray等。
搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB
注:全局变量在局部区域里只能查看不能对其操作,有类似的找工作笔试题:
g_count=10#全局变量 def f(): g_count=1 #这是允许的#局部变量 |
g_count=10 def f(): g_ count+=1 #这是不允许的 |
g_count=10 #定义一个全局变量 def f(): global g_count #在local里面是通过global申明一下是全局变量, print(g_count) g_count=1 #这就允许了 e_coung=3 #定义一个enclosing变量 def ff(): nonlocal e_count #在local里面是通过nonlocal申明enclosing变量 e_count+=5 |
小结
(1)变量查找顺序:LEGB,作用域局部>外层作用域>当前模块中的全局>python内置作用域;
(2)只有模块、类、及函数才能引入新作用域;
(3)对于一个变量,内部作用域先声明就会覆盖外部变量,不声明直接使用,就会使用外部作用域的变量;
(4)内部作用域要修改外部作用域变量的值时,全局变量要使用global关键字,嵌套作用域变量要使用nonlocal关键字。
nonlocal是python3新增的关键字,有了这个 关键字,就能完美的实现闭包了。
Day9 Python基础之函数基础(七)的更多相关文章
- python学习总结 --函数基础
函数基础 ### 函数简介 - 定义:具有特定功能的一段代码 - 优点: - 可以减少代码的重复书写 - 可以将功能的实现着和使用者分开,可以提高开发效率 - 分类: - 库函数:print.inpu ...
- Python学习笔记-函数基础
函数基础 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 为什么使用函数:减少重复代码.使程序变的可扩展使程序变得易维护 1.定义一个函数 #定 ...
- Python 入门基础10 --函数基础3 函数对象、名称空间、装饰器
今日内容 1.函数对象 2.名称空间与作用域 3.函数的嵌套调用与闭包 4.装饰器 一.函数对象 1.1 定义 函数名存放的就是函数地址,所以函数名也就是对象,称之为函数对象 1.2 函数对象的应用 ...
- Python 入门基础11 --函数基础4 迭代器、生成器、枚举类型
今日目录: 1.迭代器 2.可迭代对象 3.迭代器对象 4.for循环迭代器 5.生成器 6.枚举对象 一.迭代器: 循环反馈的容器(集合类型) 每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的 ...
- Python之路-函数基础&局部变量与全局变量&匿名函数&递归函数&高阶函数
一.函数的定义与调用 函数:组织好的.可重复使用的.用户实现单一或者关联功能的代码段.函数能够提高应用的模块性和代码的重复利用率.Python提供了很多内置的函数,比如len等等,另外也可以根据自己的 ...
- python学习日记(函数基础)
修改文件(原理)--回顾 #修改文件(原理) with open('name','r',encoding='utf-8') as f,\ open('password','w+',encoding=' ...
- Python 入门基础12 --函数基础5 匿名函数、内置函数
今日内容: 1.三元表达式 2.列表.元组生成式 | 字典生成式 3.递归 4.匿名函数 5.内置函数 一.三元表达式 三元运算符:就是 if...else... 语法糖 前提:if 和 else # ...
- python学习之函数基础
第一个python函数: >>> def func_1(): ... print 'hello python' ... >>> func_1() hello pyt ...
- python学习之【第八篇】:Python中的函数基础
1.前言 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2.函数的定义 定义函数时需要遵守以下规则: 函数代码块以 def 关键词开头 ...
随机推荐
- Oracle 锁机制探究
以前虽然在网上看到很多关于Oracle锁机制的描述,但总感觉哪里有缺陷不适合自己,因此花了点时间参考官网以及Tom Tyke的<Oracle 9i/10g/11g编程艺术>一书整理了一下O ...
- openSUSE Leap 15.0 Adobe Flash Player 安装说明
鉴于Firefox安装配置文件: mozilla_lib=file $MOZ_PROGRAM LIB=lib -bit.*(x86-|S/|PowerPC|ARM aarch64)’ &&am ...
- php学习----数据类型2
Boolean 布尔类型 这是最简单的类型.boolean 表达了真值,可以为 TRUE 或 FALSE. 要明确地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转 ...
- C# -- 交错数组的使用
C# -- 交错数组的使用 交错数组是元素为数组的数组.交错数组元素的维度和大小可以不同.交错数组有时称为“数组的数组”. 1. 举例一:子数组是长度相同的一维数组 static void Main( ...
- June 9. 2018, Week 23rd, Saturday
I know nothing except the fact of my ignorance. 除了自己的无知,我一无所知. Believe it or not, true wisdom exists ...
- js中split()方法得到的数组长度
js 中split(",")方法通过 ”,“ 分割字符串, 如果字符串中没有 “,” , 返回的是字符串本身 var str = “abc”://分隔符个数为0 var newSt ...
- Java同步(Synchronization)
前言 线程间的通信主要通过共享对字段的访问和对象引用字段的引用,可能会产生两种错误,线程干扰和内存一致性错误.Java的同步就是防止这些错误,但当多个线程访问同一资源会导致线程执行缓慢,甚至暂停执行. ...
- vue中父组件调用子组件函数
用法: 子组件上定义ref="refName", 父组件的方法中用 this.$refs.refName.method 去调用子组件方法 详解: 父组件里面调用子组件的函数,父组 ...
- Java基础知识点(四)
前言:记录Java基础知识点,方便熟悉与掌握. 1.面向对象的"六原则一法则" “六原则一法则”:单一职责原则.开闭原则.依赖倒转原则.里氏替换原则.接口隔离原则.合成聚合复用原则 ...
- 【HNOI2013】切糕
[HNOI2013]切糕 Sample Input 2 2 2 1 6 1 6 1 2 6 2 6 Sample Output 6 \(P,Q,R≤40,0≤D≤R\) 参考:https://blog ...