为什么要用函数?

  1、减少代码量

  2、保持一致性

  3、易维护

一、函数的定义和使用

1
2
3
4
5
6
def test(参数):
        
    ...
    函数体
    ...
    return 返回值

函数的定义:

    def:表示函数的关键字

    函数名:以后可以根据函数名调用函数,test可以作函数名

    函数体:中间可以做一系列的运算

    参数:为函数提供数据

    返回值(return):当函数执行完毕后,可以给调用者返回数据。 多个返回元组形式,单个为原形式

 def test(x):       # x代表形参
'''
2*x+1
:param x:整形数字
:return:返回计算结果
'''
y = 2*x+1
return y
print(test) # 打印test的内存地址
p = test(3) # test()表示运行,函数名加小括号,要重新赋值变量
print(p)

    形参和实参

      形参不占用内存空间,调用时才会占用内存,在调用结束后,才会被释放。实参是给实参进行赋值

 def test(x):       # x代表形参
'''
2*x+1
:param x:整形数字
:return:返回计算结果
'''
y = 2*x+1
return y
p = test(3) # test()表示运行名为test函数,3代表实参,给x进行赋值
print(p)

    位置参数:位置要一一对应,不能缺也不能多且不能给同一个形参赋予多个值(会报错)

    关键字参数:位置无需固定,但是缺一不行多一也不行  

      位置参数必须在关键字参数的左边

 def test(x,y,z):#x=1,y=2,z=3
print(x)
print(y)
print(z) # 位置参数,必须一一对应,缺一不行多一也不行
test(1,2,3) # 关键字参数,无须一一对应,缺一不行多一也不行
test(y=1,x=3,z=4) # 位置参数必须在关键字参数左边
test(1,y=2,3)#报错
test(1,3,y=2)#报错
test(1,3,z=2)
test(1,3,z=2,y=4)#报错
test(z=2,1,3)#报错 位置参数和关键字参数一起也不能给同一参数赋多个值(会报错)
不能缺也不能多

    默认参数  如果之前给了一个值一个参数,再赋予这个值一个参数,则这个值原有的参数会被覆盖掉

def handle(x, type='mysql'):
print(x)
print(type) handle('hello') # 调用handle函数,x赋值为hello,type有了默认参数

handle('hello', type='sqlite') # x赋值,type用关键字重新赋值

handle('hello', 'sqlite') # 用位置一一对应关系赋值,覆盖type原来的值



结果 hello

mysql

hello

sqlite

hello

sqlite

    参数组(*args列表,**kwargs字典) 非固定长度参数  *args是以元祖的形式表达

def test(x, *args):
print(x)
print(args) test(1)                 # 只传入x的值,args默认为空,元组形式

test(1, 2, 3, 4, 5)         # 传入x的值后,位置关系对应后,2 3 4 5对应
args以元组形式表达

test(1, {"name": "alex"})      # 传入x的值后,有一个字典,整体传入

test(1, ["x", "y", "z"])       # 传入x的值后,有一个列表,整体传入

test(1,["x","y","z"])        # 传入x的值后,列表前面加了个,则表示遍历,逐一出现表达

test(1,*("x","y","z"))        # 同上,注意表现形式

结果

1            
()              
1
(2, 3, 4, 5)
1
({'name': 'alex'},)
1
(['x', 'y', 'z'],)
1
('x', 'y', 'z')
1
('x', 'y', 'z')

    **kwargs

def test(x, **kwargs):
print(x)
print(kwargs) 以字典的形式表达 test(1, y=2, z=3) #y,z为key 后面均为值

test(1,y=2,z=3,z=4) #会报错:一个参数不能传俩个值



结果

1

{'y': 2, 'z': 3}

    *args,**kwargs同时存在,扩展性

def test(x,*args,**kwargs):
print(x)
print(args,args[-1])
print(kwargs,kwargs.get('y'))
# test(1,1,2,1,1,11,1,x=1,y=2,z=3) #报错,x传了多个值
test(1, 1, 2, 1, 1, 11, 1, y=2, z=3) #1传给x,中间位置参数给*args,关键字参数给**kwargs
test(1,*[1,2,3],**{'y':1}) #1传给x,*[1,2,3]传给*args遍历传,**{'y':1}传给**kwargs 结果
1
(1, 2, 1, 1, 11, 1) 1
{'y': 2, 'z': 3} 2
1
(1, 2, 3) 3
{'y': 1} 1

    全局变量(大写)

    定义:没有缩进的变量

    局部变量(小写)

    定义:子程序下定义的变量

name = 'lhf'                 # 这里就指全局变量

def change_name():

name = '帅了一比' # 这里就指局部变量

print('change_name', name) change_name()

print(name) 结果

change_name 帅了一比

lhf

     global声明是全局变量,nolocal指定上一级变量

      如果函数的内容无global关键字

      - 有声明局部变量

NAME = ["产品经理","廖波湿"]
def qupengfei():
NAME = "自己"
print('我要搞', NAME)
qupengfei() 结果

我要搞 自己

      - 无声明局部变量

 NAME = ["产品经理","廖波湿"]
def qupengfei():
NAME.append('XXOO')
print('我要搞', NAME)
qupengfei()

        如果函数的内同有global关键字

      - 有声明局部变量

NAME = ["产品经理","病毒尖儿"]
def qupengfei():
global NAME
NAME = "自己"
print('我要搞', NAME)
qupengfei()
结果
我要搞 ['产品经理', '病毒尖儿']
# 错误示例
NAME = ["产品经理","病毒尖儿"]
def qupengfei():
NAME = "自己" # 有局部变量,报错
global NAME # 不能在下面
print('我要搞', NAME)
qupengfei()
NAME = ["产品经理","病毒尖儿"]
def qupengfei():
global NAME
NAME = "自己"
print('我要搞', NAME)
qupengfei()
结果
我要搞 ['产品经理', '病毒尖儿']
# 错误示例
NAME = ["产品经理","病毒尖儿"]
def qupengfei():
NAME = "自己" # 有局部变量,报错
global NAME # 不能在下面
print('我要搞', NAME)
qupengfei()

      - 无声明局部变量

NAME = ["产品经理", "病毒尖儿"]

def qupengfei():

global NAME

NAME = ["三毛"]

NAME.append('XXOO')

print('我要搞', NAME) qupengfei() 结果

我要搞 ['三毛', 'XXOO']

      优先读取局部变量,能读取全局变量,但无法对全局变量重新赋值NAME=“fff”,但是对于可变类型,可以对内部元素进行操作

      如果函数中有glabal关键字,变量本质上就是全局的那个变量,可读取可赋值 NAME=“fff”

  递归函数

    自己调用自己的函数,则为递归

    特性:必须有一个明确的结束条件

       每次进入深一层递归时,问题规模都应有所减少

def calc(n):
print(n)
if int(n / 2) == 0:
return n # 当上面的条件成立后一个真值,返回到函数
res = calc(int(n / 2))
print(n,res)
return res # 返回res的值,要将真值一层一层传递回去 calc(10)

    匿名函数   用lambda去定义

例1:

 def calc(x):
return x+1
res=calc(10)
print(res) # 输出结果
print(calc) # 输出calc这个函数的内存地址
print(lambda x:x+1)# 输出lambda这个表达式的内存地址
func = lambda x:x+1# x代表形参,x+1为返回值
print(func(10)) # 给lambda表达式传入值,输出结果 """
结果
11
11
<function <lambda> at 0x000001F6D84897B8>
11
"""

例2:

name = "alex"
def change_name(x):
return name+"_sb"
res = change_name(name)
print(res) func = lambda x:x+"_sb"

res = func(name)

print(res)

    函数式编程

      函数接收的参数是一个函数名

    高阶函数

      1、把函数当作一个参数传给另一个函数

      2、返回值中包含参数

 def bar():
print('from bar')
def foo():
print('from foo')
return bar
n = foo()
n()

返回值中包含函数

转自:

python之函数介绍及使用 - 病毒尖er - 博客园

http://www.cnblogs.com/leguan1314/articles/6116928.html

(转)python之函数介绍及使用的更多相关文章

  1. python strip()函数 介绍

    python strip()函数 介绍,需要的朋友可以参考一下   函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm)        删除s字符串中开头.结尾处,位于 rm删除 ...

  2. 移动端自动化测试(二)之 Appium常用的API(python)函数介绍

    上一章节已经介绍了Appium的环境搭建,其实只要掌握了Appium的工作原理,前期的准备工作和安装过程是比较简单的.那么当我们搭建好Appium环境后接下来做些什么呢?通常思路是开始appium的第 ...

  3. python socket 函数介绍

    socket 函数原型:socket.socket([family[,type[,proto]]]) family参数取值(协议族): socket.AF_INET        -->ipv4 ...

  4. python的函数介绍 位置参数 关键字参数 默认参数 参数组 *args **kwargs

    1.数学意义的函数与python中的函数 数学意义的函数 y = 2*3+1 x =3 y =7 x是自变量,y是因变量 2.python中定义函数的方法 一个函数往往都是为了完成一个特定的功能而存在 ...

  5. python之函数介绍

    # 函数 # 什么是函数: 能完成特定功能的工具,在Python中表示能完成特定功能的代码块.(函数定义) # 为什么要用函数 :①函数可以重复调用出来,效率高,而且维护成本低 ②使程序结构看起来清晰 ...

  6. python strip()函数介绍

    函数原型 声明:str为字符串,s为要删除的字符序列 str.strip(s)        删除str字符串中开头.结尾处,位于 s删除序列的字符 str.lstrip(s)       删除str ...

  7. python zip函数介绍

    首先用help(zip)来看一下帮助文档:

  8. python discover 函数介绍

    discover(start_dir,pattern='test*.py',top_level_dir=None)找到指定目录下所有测试模块,并可递归查到子目录下的测试木块,只有匹配到的文件名才会被加 ...

  9. python strip() 函数和 split() 函数的详解及实例

    strip是删除的意思:split则是分割的意思.strip可以删除字符串的某些字符,split则是根据规定的字符将字符串进行分割. 1.Python strip()函数 介绍 函数原型 声明:s为字 ...

随机推荐

  1. UnixBench算分介绍

    关于如何用UnixBench,介绍文章很多,这里就不展开了.这里重点描述下它是如何算分的. 运行参数 碰到很多客户,装好后,直接./Run,就把结果跑出来了,然后还只取最后一个分值,比谁高谁低.下面列 ...

  2. 「ZJOI2019」语言 解题报告

    「ZJOI2019」语言 3个\(\log\)做法比较简单,但是写起来还是有点麻烦的. 大概就是树剖把链划分为\(\log\)段,然后任意两段可以组成一个矩形,就是个矩形面积并,听说卡卡就过去了. 好 ...

  3. 【Flutter学习】基本组件之图片组件Image

    一,概述 Image(图片组件)是显示图像的组件,一个显示图片的widget,支持图像格式:JPEG,PNG,GIF,动画GIF,WebP,动画WebP,BMP和WBMP. Image组件有多种构造函 ...

  4. 误将SELINUXTYPE看成SELINUX后,将其值改为disabled。导致操作系统服务启动,无法进入单用户模式

    环境:Redhat 6.4 ORACLE11g RAC 在安装ORACLE11g之前需要关闭操作系统的防火墙和SELinux. 1.关闭防火墙:iptables -F————————————清除防火墙 ...

  5. elementUi-复选框,使用v-for循环出来的复选框,默认多个值为勾选状态

    1. 使用 v-model="BottomSelectFor[index].tick" 绑定要默认勾选的状态 2.在数组中定义 tick:true,没有的字段默认为false 3. ...

  6. php开发面试题---2、php常用面试题二(表单提交方式中的get和post有什么区别)

    php开发面试题---2.php常用面试题二(表单提交方式中的get和post有什么区别) 一.总结 一句话总结: 数据位置:get参数在url里面,post在主体里面 数据大小:get几kb,pos ...

  7. 破解极验(geetest)验证码

      破解极验(geetest)验证码 这是两年前的帖子: http://www.v2ex.com/t/138479 一个月前的破解程序,我没用过 asp.net ,不知道是不是真的破解了, demo ...

  8. 红黑数之原理分析及C语言实现

    目录: 1.红黑树简介(概念,特征,用途) 2.红黑树的C语言实现(树形结构,添加,旋转) 3.部分面试题() 1.红黑树简介 1.1 红黑树概念 红黑树(Red-Black Tree,简称R-B T ...

  9. 拾遗:vim 快捷键设置

    ~/.vimrc 零.批量注释与反注释 :sp / :vsp       横向 / 纵向拆分窗口 :e            打开新文件 zc:拆叠代码 / zo:展开代码 set foldmetho ...

  10. php连接mysql遇到的问题: (HY000/1130) 和 [caching_sha2_password]

    说明一下我的mysql是安装在虚拟机上的 所以遇到的第一个问题就是访问问题 解决: update user set host = '%' where user = 'root'; 重启mysql服务 ...