初学Python——函数
一、函数定义
def name( parameters): #没有参数括号内可以为空
"函数描述" #其实就是注释
<代码块>
return [expression] #没有返回值可以不加[]内容,也可以省略return
def是定义函数的关键字,name是函数名,parameters是形参
函数描述可以省略,但建议要有
expression是返回值,可以没有返回值,也可以没有retrun。
函数在return处结束。
二、传参过程
这里需要了解几个名词:位置参数、关键参数、默认参数
1.位置参数:按照函数形式参数的顺序传递参数
def func(x,y):
print("x={0} y={1}".format(x,y)) func(3,4)
func(4,3) #输出:
x=3 y=4
x=4 y=3
可以发现,位置参数的使用相当于C语言当中的函数调用方式。
2.关键参数:指的是在传递参数时,不必考虑形式参数的具体先后顺序,以“形式参数=实际参数”的形式传参。
def func(x,y):
print("x={0} y={1}".format(x,y)) func(y=3,x=4) #输出结果:
x=4 y=3
3.默认参数:如果函数有默认参数,允许调用函数时不对默认参数传参(这时形参为默认值)
def text2(x,y=2):#y为默认参数,非必须传递
print(x,y) text2(1) #可以这样调用
text2(1,3) #也可以这样调用 #输出结果:
1 2
1 3
4.参数组
如何向函数传递一个元组呢?
需要参数组。
def text3(*args):
print(args) text3(1,2,3) #当使用参数组时,调用函数可以不传参
#输出:
(1,2,3)
形参中*args是参数组,可以接收数量不固定的参数,也可以接收0个参数,并将这些参数组成一个元组在函数中使用。
参数组可以在参数个数不确定的情况下使用。
5.字典的传递
def text5(**kwargs):#向函数传递字典
print(kwargs)
text5() #调用函数时可以不传参
text5(name="liuwei",sex="man",index=3) #标准的传参传字典过程 #输出结果:
{“name”:"liuwei","sex":"man","index":3} #3是int型
这种传参方式很容易和关键参数混淆。
6.多种类型参数传递和优先级问题
def text6(a,b=2,*args,**kwargs):
print(a)
print(b)
print(args)
print(kwargs)
text6("woo",3,sex="m",hobby="aa") #输出结果:
woo
3
()
{'sex': 'm', 'hobby': 'aa'}
在定义函数时,形参应当遵循 普通参数-->默认参数-->参数组-->字典参数 的顺序
在调用函数时,实参应当遵循 位置参数-->关键参数-->参数组-->字典参数 的顺序
这样做为的是避免混淆。
7.如何传递列表
(1)位置参数
def func(names):
print(names)
names[1] = 'jujinyi' names = ['aaron','jim']
func(names)
print(names) #输出:
['aaron', 'jim']
['aaron', 'jujinyi']
永久性改变了列表的值。如果想要对列表附件操作,可以用切片的方式
def func(names):
print(names)
names[1] = 'jujinyi' names = ['aaron','jim']
func(names)
print(names) #输出:
['aaron', 'jim']
['aaron', 'jim']
(2)关键参数
本质上和位置参数是一样的,没有什么区别
(3)元组传递
将传进去的元组使用list函数
def func(*toppings):
toppings = list(toppings)
print(toppings) func('mushrooms','extra','cheese')
func('mushrooms','extra') #输出:
['mushrooms', 'extra', 'cheese']
['mushrooms', 'extra']
三、返回值
可以返回任何类型。基本数据类型(字符、整型等),列表(元组),字典,集合,甚至函数名也可以被返回
如果返回多个值,所有的返回值会被封装成一个元组返回
四、局部变量和全局变量
1.定义
全局变量是定义在函数体外面的变量,局部变量是定义在函数体内的变量
全局变量的作用域和生命周期从被定义开始直到程序结束,而局部变量则是从被定义到所在的函数结束。
2.全局变量的使用
全局变量当然可以在函数体外随意使用,在函数体内还会一样吗?
a=6
c=[1,2,3,4,5]
def text():
a=5
b=10
c[1]=0
print("a={0},b={1},c={2}".format(a,b,c)) text()
print("a={0},b={1},c={2}".format(a,b,c))
运行结果报错,问题出在最后一行:NameError: name 'b' is not defined。因为变量b是局部变量,只存在于函数内,在函数外已经不存在了。
改一下:
print("a={0},c={1}".format(a,c))
#输出结果:
a=5,b=10,c=[1, 0, 3, 4, 5]
a=6,c=[1, 0, 3, 4, 5]
发现了什么问题?a和c同为全局变量,都在函数内经过了修改,但是c被永久性的修改,a只是在函数内被修改,出来后被复原了。
这是因为列表c在函数内外都是原件,而整型a在函数内修改,修改的是函数拷贝的临时变量,保证了全局变量的安全性。
因此,可以用函数直接对列表、字典、集合等复杂类型的全局变量进行操作,但是无法在函数内对基本类型(如int,str,float等)的全局变量进行修改。
3.如何在函数内修改基本类型的全局变量?
Python提供了global关键字来进行声明
a=6
def text():
global a #声明要在函数内修改全局变量
a=10
print(a) text()
print(a) #运行结果:
10
10
这样,全局变量就被修改了。
虽然有这种方法,但是如果没有这种强烈需求的话,尽量不要这么做。
五、高阶函数和嵌套函数
1.以下两个条件满足其一就可称之为高阶函数:
(1)把函数名当做实参传递给另一个函数
(2)返回值中包含函数名
2.函数可以嵌套,即函数体内可以定义函数
六、递归
定义:如果在函数内部可以调用自己,那么就称之为递归函数
递归需要满足的特性:
1.必须有一个明确的结束条件 (python内有预定的最大递归层数:999,程序的保护机制)
2.每深入一层时,问题的规模应该减小
3.递归的效率不高,递归层次过多容易导致栈溢出
初学Python——函数的更多相关文章
- 初学 Python(十三)——匿名函数
初学 Python(十三)--匿名函数 初学 Python,主要整理一些学习到的知识点,这次是匿名函数. # -*- coding:utf-8 -*- #关键字lambda定义的函数都是匿名函数 #做 ...
- 初学 Python(十二)——高阶函数
初学 Python(十二)--高阶函数 初学 Python,主要整理一些学习到的知识点,这次是高阶函数. #-*- coding:utf-8 -*- ''''' 话说高阶函数: 能用函数作为参数的函数 ...
- 初学Python(九)——函数
初学Python(九)--函数 初学Python,主要整理一些学习到的知识点,这次是函数. 函数定义: # -*- coding:utf-8 -*- #函数的定义 def my_function(x) ...
- 初学 Python(十五)——装饰器
初学 Python(十五)--装饰器 初学 Python,主要整理一些学习到的知识点,这次是生成器. #-*- coding:utf-8 -*- import functools def curren ...
- 初学 Python(十四)——生成器
初学 Python(十四)--生成器 初学 Python,主要整理一些学习到的知识点,这次是生成器. # -*- coding:utf-8 -*- ''''' 生成式的作用: 减少内存占有,不用一次性 ...
- Python函数可变参数*args及**kwargs详解
初学Python的同学们看到代码中类似func(*args, **kwargs)这样的函数参数定义时,经常感到一头雾水. 下面通过一个简单的例子来详细解释下Python函数可变参数*args及**kw ...
- 初学python之感悟
python的强大有目共睹,现将初学python,觉得其中比较重要的知识罗列如下: 类似于数组的东西:列表.元组.集合.字符串以及字典,这几个东西充分体现了python的强大和逆天. 列表: x=[1 ...
- 初学Python常见异常错误,总有一处你会遇到!
初学Python常见错误 忘记写冒号 误用= 错误 缩紧 变量没有定义 中英文输入法导致的错误 不同数据类型的拼接 索引位置问题 使用字典中不存在的键 忘了括号 漏传参数 缺失依赖库 使用了pytho ...
- 初学Python写二进制文件
初学Python写二进制文件 把一个图片的16进制数据保存到一个txt文本,从这个txt文本读出并保存为二进制文件jpg图片文件.说明:图片读出的0xff粘贴ff到文本中,读出时是字符串的”ff”. ...
随机推荐
- apk公钥私钥用法
每个密钥都包含两个文件:一个是扩展名为 .x509.pem 的证书,另一个是扩展名为 .pk8 的私钥.私钥需要加以保密,并用于对 apk 包进行签名.密钥本身也可能受密码保护.相比之下,证书只包含公 ...
- python 正则表达式中反斜杠(\)的麻烦和陷阱
这里是一点小心得:由于下面两个原因,在正则表达式中使用反斜杠就会产生了一个双重转换的问题. (1).python自身处理字符串时,反斜杠是用于转义字符 (2).正则表达式也使用反斜杠来转义字符 ...
- 关于正餐智能POS6.0.1.1改版后,点击反结账进入点菜界面后无法进行加菜的FAQ
适用版本:智能POS正餐V6.0.1.1+适用情况:点击反结账进入点菜界面后无法进行加菜.原因:为让报表统计的数据更准确解决方案:1.点击反结账,输入用户密码,进入点菜界面. 2.点击结算,进入收银台 ...
- Symantec Backup Exec Agent 推送错误Error connecting to the remote computer. Ensure that the computer is available, has WMI enabled and is not blocked by a firewall
如果在Symantec Backup Server上推送Symantec Backup Exec Agent到数据库服务器遇到“"Error connecting to the remote ...
- mssql instead of 触发器应用一-创建只读视图(view)的方法
转自: http://www.maomao365.com/?p=4906 <span style="color:white;background-color:blue;font-wei ...
- django静态模版使用
第一步:在app目录下建立static文件夹,将CSS文件.js文件放到static文件夹下 第二步:TEMPLATES = [ { 'BACKEND': 'django.template.backe ...
- 常用判断重复记录的SQL语句
1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from people where peopleId in (select peopleId fro ...
- C# -- 索引器、枚举类型
C# -- 索引器.枚举类型 索引器允许类或结构的实例就像数组一样进行索引. 无需显式指定类型或实例成员,即可设置或检索索引值. 索引器类似于属性,不同之处在于它们的访问器需要使用参数. 1. 索引器 ...
- 设置Linux环境变量的方法和区别_Ubuntu
设置 Linux 环境变量可以通过 export 实现,也可以通过修改几个文件来实现,有必要弄清楚这两种方法以及这几个文件的区别. 通过文件设置 Linux 环境变量 首先是设置全局环境变量,对所有用 ...
- May 25. 2018 Week 21st Friday
Nothing for nothing. 不费力气,就一无所得. These days I am busy in compiling a lightweight communication libra ...