参考链接: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语句把结果返回

注意:

    1. 函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束
    2. 如果未在函数中指定return,那这个函数的返回值为None
    3. 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基础之函数基础(七)的更多相关文章

  1. python学习总结 --函数基础

    函数基础 ### 函数简介 - 定义:具有特定功能的一段代码 - 优点: - 可以减少代码的重复书写 - 可以将功能的实现着和使用者分开,可以提高开发效率 - 分类: - 库函数:print.inpu ...

  2. Python学习笔记-函数基础

    函数基础 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 为什么使用函数:减少重复代码.使程序变的可扩展使程序变得易维护 1.定义一个函数 #定 ...

  3. Python 入门基础10 --函数基础3 函数对象、名称空间、装饰器

    今日内容 1.函数对象 2.名称空间与作用域 3.函数的嵌套调用与闭包 4.装饰器 一.函数对象 1.1 定义 函数名存放的就是函数地址,所以函数名也就是对象,称之为函数对象 1.2 函数对象的应用 ...

  4. Python 入门基础11 --函数基础4 迭代器、生成器、枚举类型

    今日目录: 1.迭代器 2.可迭代对象 3.迭代器对象 4.for循环迭代器 5.生成器 6.枚举对象 一.迭代器: 循环反馈的容器(集合类型) 每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的 ...

  5. Python之路-函数基础&局部变量与全局变量&匿名函数&递归函数&高阶函数

    一.函数的定义与调用 函数:组织好的.可重复使用的.用户实现单一或者关联功能的代码段.函数能够提高应用的模块性和代码的重复利用率.Python提供了很多内置的函数,比如len等等,另外也可以根据自己的 ...

  6. python学习日记(函数基础)

    修改文件(原理)--回顾 #修改文件(原理) with open('name','r',encoding='utf-8') as f,\ open('password','w+',encoding=' ...

  7. Python 入门基础12 --函数基础5 匿名函数、内置函数

    今日内容: 1.三元表达式 2.列表.元组生成式 | 字典生成式 3.递归 4.匿名函数 5.内置函数 一.三元表达式 三元运算符:就是 if...else... 语法糖 前提:if 和 else # ...

  8. python学习之函数基础

    第一个python函数: >>> def func_1(): ... print 'hello python' ... >>> func_1() hello pyt ...

  9. python学习之【第八篇】:Python中的函数基础

    1.前言 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2.函数的定义 定义函数时需要遵守以下规则: 函数代码块以 def 关键词开头 ...

随机推荐

  1. Oracle 锁机制探究

    以前虽然在网上看到很多关于Oracle锁机制的描述,但总感觉哪里有缺陷不适合自己,因此花了点时间参考官网以及Tom Tyke的<Oracle 9i/10g/11g编程艺术>一书整理了一下O ...

  2. openSUSE Leap 15.0 Adobe Flash Player 安装说明

    鉴于Firefox安装配置文件: mozilla_lib=file $MOZ_PROGRAM LIB=lib -bit.*(x86-|S/|PowerPC|ARM aarch64)’ &&am ...

  3. php学习----数据类型2

    Boolean 布尔类型 这是最简单的类型.boolean 表达了真值,可以为 TRUE 或 FALSE. 要明确地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转 ...

  4. C# -- 交错数组的使用

    C# -- 交错数组的使用 交错数组是元素为数组的数组.交错数组元素的维度和大小可以不同.交错数组有时称为“数组的数组”. 1. 举例一:子数组是长度相同的一维数组 static void Main( ...

  5. June 9. 2018, Week 23rd, Saturday

    I know nothing except the fact of my ignorance. 除了自己的无知,我一无所知. Believe it or not, true wisdom exists ...

  6. js中split()方法得到的数组长度

    js 中split(",")方法通过 ”,“ 分割字符串, 如果字符串中没有 “,” , 返回的是字符串本身 var str = “abc”://分隔符个数为0 var newSt ...

  7. Java同步(Synchronization)

    前言 线程间的通信主要通过共享对字段的访问和对象引用字段的引用,可能会产生两种错误,线程干扰和内存一致性错误.Java的同步就是防止这些错误,但当多个线程访问同一资源会导致线程执行缓慢,甚至暂停执行. ...

  8. vue中父组件调用子组件函数

    用法: 子组件上定义ref="refName",  父组件的方法中用 this.$refs.refName.method 去调用子组件方法 详解: 父组件里面调用子组件的函数,父组 ...

  9. Java基础知识点(四)

    前言:记录Java基础知识点,方便熟悉与掌握. 1.面向对象的"六原则一法则" “六原则一法则”:单一职责原则.开闭原则.依赖倒转原则.里氏替换原则.接口隔离原则.合成聚合复用原则 ...

  10. 【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 ...