参考链接: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. 数据执行保护呈灰色无法开启 用命令BCEDIT无效 请问怎么解决?

    1.默认的管理员账号是关闭开不了的. 2.你重新创建个管理员账户. 3.然后登陆这个账号. 4.然后打开cmd 输入 bcdedit /set nx optin alwaysoff 这行指令.然后回车 ...

  2. 聚类——WKFCM的matlab程序

    聚类——WKFCM的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在聚类——WKFCM文章中已介绍了WKFCM算法的理论知识,现在用 ...

  3. python3编写网络爬虫15-Splash的使用

    Splash是一个JavaScript渲染服务 是一个带有HTTP API的轻量级浏览器 同时对接了python的Twisted 和QT库 利用它可以实现对动态渲染页面的抓取 功能介绍 1.异步方式处 ...

  4. JavaScript闭包理解【关键字:普通函数、变量访问作用域、闭包、解决获取元素标签索引】

        一.闭包(Closure)模糊概述 之前总觉得闭包(Closure)很抽象而且难理解,百度一下"闭包"名词,百度的解释是:“闭包是指可以包含自由(未绑定到特定对象)变量的代 ...

  5. SpringMVC-DispatcherServlet工作流程及web.xml配置

    工作流程: Web中,无非是请求和响应: 在SpringMVC中,请求的第一站是DispatcherServlet,充当前端控制器角色: DispatcherServlet会查询一个或多个处理器映射( ...

  6. 【CQOI2014】危桥

    [CQOI2014]危桥 Description Alice和Bob居住在一个由N个岛屿组成的国家,岛屿被编号为\(0\)到\(N-1\).某些岛屿之间有桥相连,桥上的道路都是双向的,但是一次只能供一 ...

  7. Linux三剑客-AWK

    1.什么是awk AWK是一种处理文本文件的语言,是一个强大的文本分析工具.有统计和计算功能. 之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Br ...

  8. UVA11882-Biggest Number(DFS+最优化剪枝)

    Problem UVA11882-Biggest Number Accept: 177    Submit: 3117Time Limit: 1000 mSec    Memory Limit : 1 ...

  9. 机器学习之MCMC算法

    1.MCMC概述 从名字我们可以看出,MCMC由两个MC组成,即蒙特卡罗方法(Monte Carlo Simulation,简称MC)和马尔科夫链(Markov Chain ,也简称MC).之前已经介 ...

  10. 转://利用从awr中查找好的执行计划来优化SQL

    原文地址:http://blog.csdn.net/zengxuewen2045/article/details/53495613 同事反应系统慢,看下是不是有锁了,登入数据库检查,没有异常锁定,但发 ...