定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

特性:

  1. 减少重复代码
  2. 使程序变的可扩展
  3. 使程序变得易维护

语法:

 def calc(x, y):
print(x*y) calc(5,9)

函数参数

形参变量

只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

实参。

可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。

默认参数

默认参数必须在位置参数的后面.否则程序会报错.

 def stu_reg(name,age,country='cn',course):
print(name,age,country,course) # countr ='cn'就是一个默认参数.

关键参数:

正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可(指定了参数名的参数就叫关键参数),但记住一个要求就是,关键参数必须放在位置参数(以位置顺序确定对应关系的参数)之后.

stu_reg(‘alex’,course =’py’,country =’CN’,age =22)
# 调用时,course,age就是关键参数.关键参数必须放在位置参数后面.

非固定参数

若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数.

def alert(msg,*users): # 当传递的参数不止一个的时候可以用非固定参数.在参数前面加个*即可,会把传入的参数变成一个元组形式.一般使用*args
for u in users:
print(msg,u) alert('警报!!!','alex','ago','shanshan','jack')
def alert(msg,*users): # 当传递的参数不止一个的时候可以用非固定参数.在参数前面加个*即可,会把传入的参数变成一个元组形式.
for u in users:
print(msg,u) alert('警报!!!',*('alex','ago','shanshan','jack'))
'''由于*users会把我们传进去的参数变成一个元组.因此我们可以直接传一个元组或者列表,但是如果直接['alex','ago','shanshan','jack']
,这样传进去.那么就会被当做元组的第一个元素就变成了(['alex','ago','shanshan','jack']).效果如下:
警报!!! ['alex', 'ago', 'shanshan', 'jack']
那么,如果我们一定要这样传参数电话,可以在列表或者元组前面加一个*即可.效果如下:
警报!!! alex
警报!!! ago
警报!!! shanshan
警报!!! jack
'''

关于非固定参数的位置:

def alert(msg,*users,age):
for u in users:
print(msg,u)
alert('警报来了.','jack', 'rain', 22) #这个传参会报错的.非固定参数会把后面所有传进来的参数都拿给自己用了.那么这样就少了一个age的参数. alert('警报来啦!','jack','rain',age = 22)
#这样不会报错的.因为age已经变成一个关键参数了.

传参:

def info (name,*args,**kwargs):
print(name,args,kwargs) info('Nick',22,'50w',address ='china', tel ='')
#输出如下:
# Nick (22, '50w') {'address': 'china', 'tel': '13899990000'} #kwargs 是以字典的形式来存储参数.

kwagrs 传参数方法:

dic = {'kg':''}
def info(name,*args,**kwargs):
print(name,args,kwargs) info('Nick',dic)
#如果这样传参的话,和之前的一样.dic里的参数会被当成元组的一个元素.输入如下:
# Nick ({'kg': '65'},) {} 后面的**kwargs没有传进来.是空的.
# 那么如果一定要传进来的话只需要在参数前加**即可
info('Nick',**dic)
#效果如下:
#Nick () {'kg': '65'}

返回值:

函数外部的代码要想获取函数的执行结果,就可以在函数里用return语句把结果返回.

 def reg_user(name,password): # 当密码大于8位时,返回True,否则返回False.函数遇到return就会停止执行函数.return后面的语句不会再执行.
print(name,password)
if len(password) >= 8:
return True
else:
return False reg_user_status = reg_user('Nick','') if reg_user_status: #根据返回值来判断是否注册成功.
print('注册成功!')
else:
print('注册失败,密码位数小于8位.')
  如果return name,password 会返回一个元组形式的返回值
  ('Nick','12345678')

注意

  • 函数在执行过程中只要遇到return语句,就会停止执行并返回结果,可以理解为 return 语句代表着函数的结束
  • 如果未在函数中指定return,那这个函数的返回值为None

局部变量:

1.在函数内部定义的变量就是局部变量,只能在函数内部调用.在程序开始定义的变量是全局变量,整个程序都可以用.

2.全局变量的作用域是整个程序,局部变量的作用域是定义该变量的函数.

3.当全局变量和局部变量名称一样时.在各自的作用域生效.

4.当只有一个全局变量,没有局部变量是.局部变量会调用全局变量.

 name = 'Jack Ma'
def print_name():
name = 'Nick guo' #在函数里面定义的这个name变量就是局部变量,只能在函数内使用.通过id查看内存地址就能看出来2个name是不一样的.
print(id(name))
print(name) print_name()
print(name)
print(id(name))
#输出如下:
#
#Nick guo
#Jack Ma
#
name = 'Jack Ma'
def print_name():
print(name) print_name() #没有局部变量时,会调用全局变量.

修改变量:

name = 'Jack Ma'
def print_name():
global name #global的作用就是在函数里声明全局变量.global前面不能声明变量.否则程序会报错.一般情况下不使用global
name = 'Nick guo'
print(id(name))
print(name) print_name()
print(name)
print(id(name))
#输入如下:
#
#Nick guo
#Nick guo
#

关于修改:

如函数外部的变量是一个可变的类型,我们可以修改其中的一个元素,但是不能直接重新进行赋值操作.

 list =['a','b','c','d','e']
def print_letter():
# list = ['a','b','c','D','E'] 这种方式会报错.
list[1] = 'B'
print(list) print_letter()
#输出如下
#['a', 'B', 'c', 'd', 'e'] 发现b被更改成了B.之前我们学的不是说在函数内不能修改全局变量吗? 注意,我们可以更改list里面的元素值,但是不能直接更改整个列表.

函数变量的查找顺序:

 age =19
def func():
age =30
print(age) # 向上查找变量age,所以age=30
def func1():
print(age) #
age = 88
func1() #程序由上而下执行.在调用func1之前,定义了一个age=88. 所以func1里age=88 func()
 age =19
def func():
def func1():
print(age)
func1()
age =88 # 这样定义age=88,会报错.因为已经定义了一个age=19.在调用函数后,又定义了一个age=88,程序无法分辨出应该调用哪个age.所以出错了. func()
print(age)
 ge =19
def func():
global age #global的作用就是在函数中修改全局变量.
def func1():
print(age)
func1()
age =88 # 如果一定要使用age=88.可在函数前加上global age 即可.但是age=19会被改成age=88 func()
print('全局age:', age)

作用域

在python中,一个函数就是一个作用域.其变量就是放在函数的作用域中.根据作用域来确定变量属于哪个函数.代码(函数)定义完成后,作用域就已经生成,不论在什么地方调用该函数.都会回到定义的作用域中执行.

匿名函数

def calc(x,y):
print(x+y) lambda x,y:x+y # 声明一个匿名函数.x,y相当于形参.x+y相当于要执行的语句.

匿名函数一般是和其他函数配合使用.

高阶函数

定义:一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。或者返回一个函数也称为高阶函数.

def func1(x,y):
return x+y def calc(x): # 接收一个函数作为参数,就称之为高阶函数.
return x print(calc(func1))
#输出如下:
# <function func1 at 0x0040C9C0> def func1(x,y):
return x+y def calc(x):
return abs,x # 返回值中包含一个函数的函数也是高阶函数. print(calc(func1(3,-7)))
# 输出如下:
#(<built-in function abs>, -4) #是一个元组类型的返回值.

Day3-1 函数的更多相关文章

  1. day3之函数的初始及进阶

    函数初始 函数的定义与调用 ''' def 函数名 (参数): 函数体 函数名:设定与变量相同 执行函数: 函数名() ''' 函数的返回值 # 函数返回值 return ''' 1.遇到return ...

  2. day3 python 函数

    常犯的错误: IndentationError:expected an indented block说明此处需要缩进,你只要在出现错误的那一行,按空格或Tab(但不能混用)键缩进就行... 函数是指一 ...

  3. python基础之元组、文件操作、编码、函数、变量

    1.集合set 集合是无序的,不重复的,主要作用: 去重,把一个列表变成集合,就可以自动去重 关系测试,测试两组数据的交集,差集,并集等关系 操作例子如下: list_1 = [1,4,5,7,3,6 ...

  4. Python函数定义、文件操作(读写、修改)

    date:2018421 day3 一.函数定义 def  函数名(首字母大写) 增加程序可读性 #直接写函数名即可调用函数 #参数 ①.形参 ②.实参 ③.缺省参数 如果有默认值,调用的时候没有传递 ...

  5. python2.0 s12 day3

    s12 day3 视频每节的内容 03 python s12 day3 本节内容概要 第三天的主要内容 上节没讲完的: 6.集合 7.collections 1)计数器 2)有序字典 3)默认字典 4 ...

  6. python3学习笔记目录

    目录: Python基础(一),Day1 python基础(二),Day2 python函数和常用模块(一),Day3 python函数和常用模块(二),Day4 python函数和常用模块(三),D ...

  7. python学习之路-3 初始python数据类型以及文件操作

    本篇涉及内容 set集合 函数 三元运算 文件操作 set集合 set是一个无序的且不重复的元素集合 1.创建set集合的方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  8. python_way,day3 集合、函数、三元运算、lambda、python的内置函数、字符转换、文件处理

    python_way,day3 一.集合 二.函数 三.三元运算 四.lambda 五.python的内置函数 六.字符转换 七.文件处理 一.集合: 1.集合的特性: 特性:无序,不重复的序列 如果 ...

  9. Day3 - Python基础3 函数、递归、内置函数

    Python之路,Day3 - Python基础3   本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8. ...

  10. 函数的非固定参数-Day3

    一.函数非固定参数 1.默认函数,我们在传参之前,选给参数指定一个默认的值.默认参数特点是非必须传递的. def test(x,y=2): print(x) print(y) print(" ...

随机推荐

  1. Linux的基础命令

    -shutdown –h now(root用户才有效)     立即关机 -shutdown –r now(root用户才有效)     立即重新启动计算机 -reboot               ...

  2. bootstrap-table 分页

    bootstrap-table   <!DOCTYPE html> <head> <meta charset="UTF-8"/> <tit ...

  3. shallow clone

    shallow clone 浅克隆经常在一些大型仓库中很有用——不用花费大量时间去clone一个完整的仓库,仅仅checkout出来某个分支(如master)的最新N次递交: git clone -- ...

  4. 路飞学城-Python开发集训-第2章

    学习心得: 这章对编码的讲解超级赞,现在对于编码终于有一点认知了,但还没有大彻大悟,还需要更加细心的琢磨一下Alex博客和视频,以前真的是被编码折磨死了,因为编码的问题而浪费的时间很多很多,现在终于感 ...

  5. MemCache在.NET中使用Memcached.ClientLibrary详解 转发 https://www.cnblogs.com/li150dan/p/9529112.html

    本文说明:memcached分布式缓存的负载均衡配置比例,数据压缩,socket的详细配置等,以及在.net中的常用方法 首先下载客户端的3个dll,ICSharpCode.SharpZipLib.d ...

  6. [ASP.NET]ScriptManager控件使用 转载

    目录 概述 局部刷新 错误处理 类型系统扩展 注册定制脚本 注册 Web 服务 在客户端脚本中使用认证和个性化服务 ScriptManagerProxy 类 添加 ScriptManager 控件 客 ...

  7. python3 练习题 day04

    '''1.整理装饰器的形成过程,背诵装饰器的固定格式''''''开放封闭原则:为了保证程序的稳定性,和功能的可开放性,在不修改目标函数源代码和调用方式的情况下,对目标函数增加新功能'''# def w ...

  8. idea 上传代码到 gitee

    https://www.2cto.com/net/201804/740238.html 这一步如果是个空仓库可以提交,如果是个已有的项目 Define remote 一下就可以了,不要提交代码

  9. ESP8266-Arduino杀手?

    Arduino之所以流行可能是因为它的学习曲线比较平缓,另外是支持它的第三方程序库非常多,无论在什么平台上都比较容易入门.多年前我曾和一些搞嵌入开发多年的朋友请教,他们更建议我多点尝试STM的开发,A ...

  10. 4月27号开学! 第6期《jmeter实战接口自动化+性能》课程,零基础也能学

    2019年 第6期<jmeter实战接口自动化+性能>课程,4月27号开学! 主讲老师:飞天小子 上课方式:QQ群视频在线教学 本期上课时间:4月27号-6月9号,每周六.周日晚上20:0 ...