简单介绍下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& ...
随机推荐
- 20155325 2016-2017-2 《Java程序设计》第5周学习总结
教材学习内容总结 Java中把正常流程放try块中,错误(异常)处理放catch块中. Error及其子类写程序不用处理,最多留个日志.因为这种错误Java应用程序本身是无力回复的. 在使用throw ...
- 15、BigDecimal类简介
BigDecimal类概述 由于在运算的时候,float类型和double很容易丢失精度,在金融.银行等对数值精度要求非常高的领域里面,就不能使用float或double了,为了能精确的表示.计算浮点 ...
- linux安装rz,sz命令
安装方法: yum install lrzsz -y
- sql 通过分数字段倒排获取名次的方法
row_number() over(order by sort desc) 应用场景: 比如学员成绩表中有userid,username,sorce登字段,需要取出学员成绩的名次:表中没有名次字段,只 ...
- [Openwrt 扩展下篇] Openwrt搭建私有云Owncloud 9
网上很多资料讲用Linux打造owncloud构建私有云 ,花了些时间研究了下,我将之前的需求打造成了Openwrt下的Owncloud 9.其实网上还有Seafile.大家对比来看下知乎的评论,其实 ...
- 差分约束系统+spfa(B - World Exhibition HDU - 3592 )
题目链接:https://cn.vjudge.net/contest/276233#problem/B 思路和上一个一样,不过注意点有两个,第一,对dis数组进行初始化的时候,应该初始化成ox3f3f ...
- PE文件结构及其加载机制
一.PE文件结构 PE即Portable Executable,是win32环境自身所带的执行体文件格式,其部分特性继承自Unix的COFF(Common Object File Format)文件格 ...
- 打包egg
scrapyd-deploy -p chahao -v 1.0 --build-egg chahao.egg
- haproxy支持的负载均衡算法详解
目前haproxy支持的负载均衡算法有如下8种: 1.roundrobin 表示简单的轮询,每个服务器根据权重轮流使用,在服务器的处理时间平均分配的情况下这是最流畅和公平的算法.该算法是动态的,对于实 ...
- XP远程连接Win10,提示【远程计算机需要网络级别身份验证,而您的计算机不支持该验证】
最近电脑安装了Win10系统,在办公室可以通过其他电脑远程,但是回去后使用自己的电脑(XP系统)进行远程提示失败, 提示[远程计算机需要网络级别身份验证,而您的计算机不支持该验证],然后上网查找资料, ...