简单介绍下python中函数的基础语法
python 函数
定义
函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可。
特性
- 减少代码重复
- 使程序变得可扩展
- 使程序变得易于维护
函数的创建
python中创建函数,需要使用__def__关键字,后面写函数的名字,然后是形参列表,大体如下:
def 函数名(形参列表):
函数体......
return 返回值
其中形参列表和 return返回值并不是必须的。
函数的使用
想要调用函数程序,需要以函数名加括号的形式进行调用,而括号内可以传入参数,而括号内的参数我们称之为__实参列表__,传入的实参会通过形参传递进函数,在函数内部就可以使用了。如下:
def add(x,y):
return x + y
# 调用函数
add(10,20)
需要注意的是,python中的实参列表每一个参数之前用逗号分割,而向add()括号内的10,20这样的参数我们称之为位置参数(positional argument)。
那么需要注意的是,在python中,函数的实参的个数必须和形参的个数一样,实参个数多于形参或者少于形参都会报错。
函数的参数
形参也可以叫做形参变量,只有在被调用时才分配内存单元,在调用结束时,即释放所分配的内存单元。所以形参只能在函数内部生效。函数调用结束返回主调用函数后则不能够再使用该形参变量。
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值

默认参数
首先,先来看下面的代码:
def stu_register(name,age,country,course):
print('------注册学生信息--------')
print('学员姓名:',name)
print('学员年龄:',age)
print('学员国籍:',country)
print('学员选择课程:',course)
stu_register('小明',19,'中国','web前端')
stu_register('小红',20,'中国','linux')
stu_register('李白',25,'中国','python')
在上面的实例中,每一个学员注册的国籍都是中国,而在网上的一些网站中,如果不去手动设置,都默认为中国,这就是通过默认参数实现的。
如下,把country变成默认参数,
def stu_register(name,age,course,country='中国')
那么此时再注册学员的时候如果国籍是中国就可以不需要进行国籍的传参,而是采用默认的参数。
关键参数
正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可,但记住一个要求就是,关键参数必须放在位置参数之后。
# 使用关键字参数
stu_register(name='小明',country='中国',age=19,course='linux')
'''关键字参数必须放在位置参数之后'''
stu_register('小红',country='中国',age=19,course='linux')
非固定参数
如果你的函数中并不是很确定用户会传入多少个参数,那么就可以使用非固定参数。
'''非固定参数'''
def test01(x,y,*args):
print(x,y)
print(args)
test01('李白','艳艳',12,3,4)
输出结果为:
李白 艳艳
(12, 3, 4)
需要注意的是,当使用了*args的时候,会发现传入的参数全部被放在了一个元组中。那么如果想要操作的话只需按照元组的操作方式操作即可。
非固定参数除了可以转换成元组以外,还可以将传入的数据转换成字典,需要使用**kwargs,代码如下:
def stu_register(name,age,*args,**kwargs): # *kwargs 会把多传入的参数变成一个dict形式
print(name,age,args,kwargs)
stu_register("Alex",22)
#输出
#Alex 22 () {}#后面这个{}就是kwargs,只是因为没传值,所以为空
stu_register("Jack",32,"CN","Python",sex="Male",province="ShanDong")
#输出
# Jack 32 ('CN', 'Python') {'province': 'ShanDong', 'sex': 'Male'}
局部变量和全局变量
在python中,函数外部声明的变量我们称之为全局变量,在函数内部声明的变量是局部变量。
全局变量可以在变量声明之后的任何位置使用,而局部变量只能够在函数内部使用。
'''全局变量和局部变量'''
name = '李白' # 函数外部声明 ,称之为全局变量
def test():
age = 20 # 函数内部声明,称之为局部变量
print(age) # 局部变量只能够在函数内部使用
print(name) # 全局变量可以在函数内部使用
test()
# print(age) 在函数外部没有办法使用局部变量
如果想要在函数内部声明全局变量,需要使用global关键字
def test():
global test
test = '李白斗酒诗百篇'
test()
print(test) # 李白斗酒诗百篇
通过global关键字就能够在函数内部创建全局变量,但是这种写法是不推荐使用的,有可能造成变量污染。
还有一点需要注意,看下面的代码:
name = '艳艳'
def test():
# 在函数中更改全局变量name的值
name = 'hello,world'
print(name) # hello,world
test()
print(name) # 艳艳
上述代码中,在函数中对全局变量进行了更改,并且打印更改之后的变量,那么打印的结果是更改的结果,但是在函数的外面再次打印在函数中更改的全局变量,发现结果并没有被更改,因为在函数中更改全局变量,那么更改过后的值作用域仅停留在函数当中。
那么如何在函数中对全局变量更改并且在函数外部调用结果为更改之后的值呢?同样可以使用global关键字来实现。
name = '艳艳'
def test():
global name
# 在函数中更改全局变量name的值
name = 'hello,world'
print(name) # hello,world
test()
print(name) # hello,world
返回值
要想获取函数的执行结果,就可以用return语句把结果返回
注意:
函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束
如果未在函数中指定return,那这个函数的返回值为None 。
递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
'''创建一个递归,将传入的参数不断的除以2,到0为止'''
def calc(n):
print(n)
if int(n/2) > 0 :
return calc( int(n/2) )
calc(10)
输出结果为:
10
5
2
1
递归特性:
必须有一个明确的结束条件
每次进入更深一层递归时,问题规模相比上次递归都应有所减少
递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
堆栈扫盲http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html
简单介绍下python中函数的基础语法的更多相关文章
- python 中函数参数传递形式
python中函数参数的传递是通过赋值来传递的.函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析 先看第一个问题,在python中函数参数的定义主要 ...
- 深入理解python中函数传递参数是值传递还是引用传递
深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是"传对象引用 ...
- python中pandas数据分析基础3(数据索引、数据分组与分组运算、数据离散化、数据合并)
//2019.07.19/20 python中pandas数据分析基础(数据重塑与轴向转化.数据分组与分组运算.离散化处理.多数据文件合并操作) 3.1 数据重塑与轴向转换1.层次化索引使得一个轴上拥 ...
- 简单探讨python中的语句和语法
python程序结构 python"一切皆对象",这是接触python听到最多的总结了.在python中最基层的单位应该就是对象了,对象需要靠表达式建立处理,而表达式往往存在于语句 ...
- (转)python中函数参数中如果带有默认参数list的特殊情况
在python中函数参数中如果带有默认参数list遇到问题 先看一段代码 1 2 3 4 5 6 7 8 9 def f(x,l=[]): for i in range(x): ...
- 学以致用三十二-----python中函数的括号使用
一直以来对python中函数括号的使用,有点分不清楚,到底什么时候用括号,什么时候不用括号,造成了很大看困惑. 今天来总结下. class aaa(): y = 'you' def __init__( ...
- python中函数的参数
函数参数(一) 思考一个问题,如下: 现在需要定义一个函数,这个函数能够完成2个数的加法运算,并且把结果打印出来,该怎样设计?下面的代码可以吗?有什么缺陷吗? def add2num(): a = 1 ...
- python中函数参数传递的几种方法
转自 http://www.douban.com/note/13413855/ Python中函数参数的传递是通过“赋值”来传递的.但这条规则只回答了函数参数传递的“战略问题”,并没有回答“战术问题 ...
- Python中函数参数传递问题【转】
1. Python passes everything the same way, but calling it "by value" or "by reference& ...
随机推荐
- 让老版本IE支持HTML5
一直想入手C3和H5,但因为所开发的项目一直要求兼容IE7,IE8.而这两个浏览器并不支持html5,所以一直都在观望而未真正的投入太多精力去学习.尽管我知道h5和c3是主流. 在最近的项目开发中,偶 ...
- HDU 3449 Consumer (背包问题之有依赖背包)
题目链接 Problem Description FJ is going to do some shopping, and before that, he needs some boxes to ca ...
- 31、LinkedHashSet简介和练习
LinkedHashSet简介 通过LinkedHashSet的名字就可以看出,他的底层使用了链表的数据结构,因此LinkedHashSet的特点是读取元素的顺序跟存入元素的顺序是一致的,并且元素不能 ...
- 南京邮电大学CTF密码学部分Writeup
异性相吸 1.xor 2.hex2binary 3.len(bin(miwen))==len(bin(mingwen)) # -*- coding:utf-8 -*- file_de = open(' ...
- Servlet笔记5--设置欢迎页面及HTTP状态码404、500
欢迎页面: 代码详解: web.xml配置文件: <?xml version="1.0" encoding="UTF-8"?> <web-ap ...
- flask插件系列之flask_uploads上传文件
前言 flask可以实现上传文件和下载文件的基本功能,但如果想要健壮的功能,使用flask_uploads插件是十分方便的. 安装 pip install flask_uploads 基本使用 # e ...
- redis持久化的两种方式
redis是一个内存型数据库.当redis服务器重启时,数据会丢失.我们可以将redis内存中的数据持久化保存到硬盘的文件中. redis持久化有两种机制.RDB与AOF.默认方式是RDB. 1.RD ...
- 20155309南皓芯2016-2017 2《Java程序设计》第一周学习总结
关于java学习笔记的思考问题 第一章:JDK与JRE,JVM之间有没有必然的联系 第二章:可执行文件夹找到相关链接库 第三章:for与while循环的用法与比较,break与continue跳出的注 ...
- U盘删除文件时提示“文件或目录损坏且无法读取”的解决方法
U盘删除文件时提示“文件或目录损坏且无法读取”的解决方法 出现原因:在写入或读取文件时,进行复制操作,此时复制到的文件是不完整的!或者移动硬盘/U盘中途被拔出,导致文件损坏 异常现象:被删文件(夹)属 ...
- 阿里云宝塔Linux服务器管理面版初始化地址不能登入(原创)
宝塔面板是一款可以让Linux服务器实现图形可视化操作的集成系统. 安装好以后,页面初始化登录地址http://{您的服务器IP}:888不能登入. 不能登入通常是我们没有权限访问,需要更改安全组赋予 ...