一、函数的定义和使用

1、基本结构:

1 def函数名(参数):2 """

3 文档字符串4 """

5 函数体6 返回值7

2、函数名:

和变量名命名规则一致,最好不要与内置函数名相同

3、参数:

和C/C++不同,参数无需指定类型,直接交由解释器去判断:

对于number, str, tuple等不可变的对象,相当于传值,即是传递了拷贝

对于list,dict,set等可变对象,相当于引用传递,内部更改会影响外部的值

a.普通参数:和c类似,但是无需指定类型,所以任何类型都可以传递给函数

1 deffunc(argument):2 print(argument)3

4

5 func("string")6 func(4)

b.默认参数:与c++中一样,也能在定义时给参数指定一个缺省的值,但是必须放在参数列表后面位置

1 def func(name, age = 20):2 print(name, age)3

4

5 func("Edward")6 func("Edward", 18)

c.动态参数:对于动态参数而言,最大好处是可以灵活的使用参数,而无须考虑其个数,其通过tuple(一般用*args表示)和dict(一般用**kwargs)的特性来实现:

对于tuple,一般用户用a, b, c, ... 的形式,会被解释器自动转化为一个tuple来存储,解决了任意数量的普通参数的传递

对于dict,一般用户用x1 = a1, x2 = a2, x3 = a3,...的形式,会被转化为一个dict来存储,解决了任意数量的关键词参数的传递

1 def func(*args, **kwargs):2 for i inargs:3 print(i)4 for k, v inkwargs.items():5 print("%s = %s" %(k, v))6

7

8 func("Edward", 19)9 func(name = "Edward", age = 19)10 func("Edward", "Tang", age = 19)

也可以直接将一个tuple或list传递给args, 将一个dict传递给kwargs,但要注意此时必须在引用实参的时候加上*或**:

1 tup = ("Edward", 19)2 dic = dict(name = "Edward", age = 19)3 func(*tup)4 func(**dic)5 #如果不加*, 会被认为是tuple的一个元素

4、文档字符串:

写函数时,最好在内部最开始加一个docstrings,即文档字符串,方便其他人理解函数的功能

其有下面几个要求:

使用三个双引号来区别多行注释

第一行作为函数功能的简要概述,最好以大写字母开头,句号结尾,无需明确对象的类型和名字

第二行为空

后面叙述函数的具体功能,一定要有函数的参数以及返回值的详细描述

可以用__doc__来引用模块的文档字符串

5、函数体:函数的具体实现

6、返回值:即将函数的执行结果返回,未指定为None

在Python中,由于tuple的存在,可以一次性返回多个值:

1 deffunc(a):2 return a * a, a **a3

4

5 x, y = func(4) # x = 16, y = 256

7、函数的调用:

由于Python的解释以及执行顺序都是从上往下,所以要想调用函数,必须函数在之前有定义

在Python中,未加函数定义的语句属于主体,相当于c中的主函数,一般放在最后,以便调用之前的函数

若有几个文件的相互引用,可添加一下代码: 在一个文件中,相当于主函数的入口,但是如果此文件作为模块被其他文件引用,则此段代码由于为False,将不会执行,所以可以用作测试模块的功能

1 deffunc()2 pass

3

4

5 if __name__ == "__main__":6 func()

二、lambda表达式

即一个小的匿名的函数,一般只有函数体很短时使用:

1 a = lambda x: x ** 2

2 a(2)3 #4

1、与filter、map、reduce的结合使用:

1 seq = [1, 76, 5, 44, 13, 5, 23]2

3 a = filter(lambda x : x > 10, seq)4 #list(a) = [76, 44, 13, 23]

5

6 b = map(lambda x : x ** 2, seq)7 #list(b) = [1, 5776, 25, 1936, 169, 25, 529]

8

9 from functools importreduce10 c = reduce(lambda x, y: x * y, range(1, 100))11 #c的结果为99!

2、与sorted的结合使用:

1 seq = ["Tang", "Edward", "love", "handsome"]2 seq = sorted(seq, key=lambdaa : a.upper())3 #seq = ['Edward', 'handsome', 'love', 'Tang']

三、内置函数

Python内置了丰富的函数,适合于各种类型的对象,下面来详细讨论

1、大多数的函数

1 def abs(*args, **kwargs):2 pass

3 #返回参数的绝对值

4

5 def all(*args, **kwargs):6 pass

7 #返回True如果可变对象所有元素都为真,为空时返回True

8

9 def any(*args, **kwargs):10 pass

11 #返回False如果可变对象所有元素都为假,为空时返回True

12

13 def bin(*args, **kwargs):14 pass

15 #返回参数的二进制表示

16

17 def hex(*args, **kwargs):18 pass

19 #返回参数的十六进制表示

20

21 def oct(*args, **kwargs):22 pass

23 #返回参数的八进制表示

24

25 defcallable(i_e_, some_kind_of_function):26 pass

27 #返回对象是否可调用

28

29 def chr(*args, **kwargs):30 pass

31 #返回整数参数对应的ASCII码的字符

32

33 def ord(*args, **kwargs):34 pass

35 #返回单个字符的unicode值

36

37 defdelattr(x, y):38 pass

39 #删除对象x的‘y’属性(类似于del x.y)

40

41 def getattr(object, name, default=None):42 pass

43 #返回object的'name'的属性的值,若不存在,返回default

44

45 defhasattr(object, name):46 pass

47 #返回True如果object对象有指定的‘name’属性

48

49 defsetattr(x, y, v):50 pass

51 #设置x的'y'属性的值为v(类似于x.y = v),其中y属性可以是不存在的

52

53 def dir(p_object=None):54 pass

55 #如果没有参数,返回当前范围的参数、方法、定义的list

56 #如果有参数,返回参数的属性,方法的list,且存在__dir__会被调用

57

58 defdivmod(x, y):59 pass

60 #返回x//y, x%构成的tuple

61

62 def eval(*args, **kwargs):63 pass

64 #计算表达式,并返回结果

65

66 def exec(*args, **kwargs):67 pass

68 #动态执行代码

69

70 defrepr(obj):71 pass

72 #返回obj的可供解释器读取的字符串,可以用eval()求值

73 #大多数情况下,eval(repr(obj)) == obj

74

75 def exit(*args, **kwargs):76 pass

77 #退出

78

79 def format(*args, **kwargs):80 pass

81 #转化为type(value).__format__(format_spec)

82

83 def globals(*args, **kwargs):84 pass

85 #返回当前全局变量构成的字典

86

87 def locals(*args, **kwargs):88 pass

89 #返回当前局部变量构成的字典

90

91 def hash(*args, **kwargs):92 pass

93 #返回参数(哈希表类型的对象)的哈希值

94

95 defhelp():96 pass

97 #返回参数的帮助信息

98

99 def id(*args, **kwargs):100 pass

101 #返回参数的内存地址(并非实际内存地址)

102

103 def input(*args, **kwargs):104 pass

105 #打印提示字符串,并读取输入返回(str类型)

106

107 defisinstance(x, A_tuple):108 pass

109 #返回x是否为元组A_tuple中其中一个类的实例

110

111 defissubclass(x, A_tuple):112 pass

113 #返回x是否为元组A_tuple中其中一个类的子类

114

115 def iter(source, sentinel=None):116 pass

117 #返回第一个参数对象的迭代器,

118 #若有第二个参数,当迭代器的__next__返回值为它时抛出异常

119

120 def len(*args, **kwargs):121 pass

122 #返回容器的item个数

123

124 def max(*args, key=None):125 pass

126 #返回所有参数中的最大值,或序列中的最大值(容器为空返回key)

127

128 def min(*args, key=None):129 pass

130 #返回所有参数中的最小值,或序列中的最小值(容器为空返回key)

131

132 def next(iterator, default=None):133 pass

134 #返回迭代器的下一个值,若已经到最后一个返回default

135

136 def open(file, mode='r', buffering=None, encoding=None,137 errors=None, newline=None, closefd=True):138 pass

139 #以特定形式打开文件

140

141 def pow(*args, **kwargs):142 pass

143 #两个参数是返回x**y, 三个参数时返回x**y%z

144

145 def print(self, *args, sep=' ', end='\n', file=None):146 pass

147 #打印,默认以空格隔开各打印值,以换行结束,不刷新

148

149 def quit(*args, **kwargs):150 pass

151 #退出

152

153 def round(number, ndigits=None):154 pass

155 #返回number的四舍五入表示

156

157 def sorted(*args, **kwargs):158 pass

159 #返回递增的排序的list

160

161 def sum(iterable, start =0):162 pass

163 #返回序列的和加上start(默认为0)

164

165 def vars(p_object=None):166 pass

167 #不带参数,返回当前对象属性及属性值的字典

168 #带参数,返回参数对应的属性及值的字典

169

170 def int(x, base = 10):171 pass

172 #返回以base进制表示的x的int形式

173

174 deffloat(x):175 pass

176 #返回x的float形式

177

178 defbool(x):179 pass

180 #返回x的bool表示

181

182 defcomplex(a, b):183 pass

184 #返回a+bj

185

186 defstr(x):187 pass

188 #返回一个str

189

190 defdict(x):191 pass

192 #返回一个字典

193

194 deflist(iterable):195 pass

196 #返回一个list

197

198 deftuple(iterable):199 pass

200 #返回一个tuple

201

202 defset(iterable):203 pass

204 #返回一个set

205

206 deffrozenset(iterable):207 pass

208 #返回一个不可变的set

209

210 defenumerate(iterable):211 pass

212 #构造序列的下标和值构成的元祖,用于循环遍历

213

214 def filter(function orNone, iterable):215 pass

216 #返回iterable中能够让function的返回值为真的元素的序列,

217 #若function为None, 返回iterable中为真的元素的序列

218

219 def map(func, *iterables):220 pass

221 #对每一个iterable, 使用func, 并将结果作为list返回

222

223 def range(start =0, stop):224 pass

225 #返回一个从start到stop构成的序列,用于遍历

226

227 defreversed(seq):228 pass

229 #返回一个seq反转的序列

230

231 deftype(object):232 pass

233 #返回object的类型

234

235 defzip(iter1 [,iter2 [...]]):236 pass

237 #分别从iter中取下标相同的元素构成tuple,在将各tuple构成list

238 #使用zip(*list)解压

239

240 #其他函数

241 #copyright, credits, license, bytearray, bytes, classmethod,

242 #memoryview, property, slice, staticmethod, super, compile

内置函数

2、内置函数总结:

数学计算和其他计算:abs, divmod, hash, len, max, min, pow, round, sorted, sum, reversed

逻辑判断:all, any

进制转换:bin, hex, oct

类型转换:int, float, bool, complex, str, dict, list, tuple, set, frozenset

类相关:callable, delattr, getattr, hasattr, setattr, dir, isinstance, issubclass

对象和属性:vars, type, id

字符串和字符编码:chr, ord, eval, exec, repr, format

IO相关: input, open, print, exit, quit

迭代器和遍历:iter, next, enumerate, range, zip

函数相关:filter, map

其他:globals, locals, help

3、几个函数详解:

delattr, getattr, hasattr和setattr:

1 classStudent(object):2 def __init__(self, name):3 self.name =name4

5 defhave_class(self):6 print("%s is having class." %self.name)7

8 s = Student("Edward")9

10 #name 以下都必须是字符串格式

11

12 #hasattr(object, name), 判断对象是否具有name属性

13 print(hasattr(s, "name")) #True

14 print(hasattr(s, "have_class")) #True

15

16 #getattr(object, name, default=None), 返回对象的name属性的值

17 #可以设置default, 但是仅仅是没有找到时返回它,并没有添加

18 print(getattr(s, "name")) #Edward

19 print(getattr(s, "age", 19)) #19

20 getattr(s, "have_class")() #会运行该属性

21 print(hasattr(s, "age")) #False, 并没有添加

22

23 #setattr(object, name, value), 设置对象的name的属性值为value

24 #若name属性不存在, 还会添加该属性

25 setattr(s, "name", "Tang")26 print(s.name) #Tang

27 setattr(s, "age", 19)28 print(hasattr(s, "age")) #True, 会添加该属性

29

30 #delattr(object, name) 删除对象的name属性

31 delattr(s, "name")32 print(hasattr(s, "name")) #False, 已被删除

eval和exec:

1 #exec(), 动态执行代码

2 exec("print('Edward Tang')")3

4 #eval() 计算表达式的值并放回

5 a = eval("7 * 6 + 1")6 print(a) #43

filter和map:

1 deffunc1(n):2 if n > 10:3 returnTrue4

5 deffunc2(n):6 return n *n7

8 deffunc3(a, b, c):9 return a * b *c10

11

12 seq = [1, 76, 5, 44, 13, 3, 5, 23]13 li1 = [4, 5, 6, 8]14 li2 = [9, 7, 10, 6]15 li3 = [5, 4, 3, 1]16

17

18 #filter对seq中的每一个元素执行func1, 如果为True, 返回原列表的这些值

19 rt1 =filter(func1, seq)20 print(list(rt1))21

22 #map对seq中的每一个元素执行func2,返回这些值执行的结果构成的序列

23 rt2 =map(func2, seq)24 print(list(rt2))25

26 #若func有多个参数,可以提供多个序列,分别依次带入,返回结果

27 rt3 =map(func3, li1, li2, li3)28 print(list(rt3))29

30 #在functools中还存在一个reduce的函数

31 #reduce(func, seq, start) func接受两个参数,

32 #对seq中两两的数进行递归调用,并返回

33 from functools importreduce34 deffunc(a, b):35 return a *b36 rt = reduce(func, range(1, 100))37 #计算99的阶乘

sorted:

1 #sorted(iterable, key=None, reverse=False)

2 #key可以用函数或lambda表达式

3 #指定reverse = True会降序排序

4 #sorted只是返回一个排序好的序列,并不改变原序列

5

6 #普通排序

7 seq = [1, 76, 5, 44, 13, 3, 5, 23]8 seq = sorted(seq, reverse=True) #降序

9

10 #使用lambda

11 seq = ["Tang", "Edward", "love", "handsome"]12 seq = sorted(seq, key=lambdaa : a.upper())13

14 #对列表的某项排序

15 arr = [['Tang', 89], ['Edward', 79], ['Hu', 67], ['Wang', 80]]16 arr = sorted(arr, key=lambda a : a[1])17

18 #对类按照某项排序

19 classPerson(object):20 def __init__(self, name, age):21 self.name =name22 self.age =age23 p1 = Person('Edward', 18)24 p2 = Person('Wang', 25)25 p3 = Person('Hu', 20)26 p4 = Person('Liang', 22)27 for item in sorted([p1, p2, p3, p4], key=lambdap : p.age):28 print(item.name, end=',')29

30 #operator模块还有itemgetter, attrgetter两个函数

31 #所以以上最后两个例子还可以表示为

32 #sorted(arr, key=itemgetter(1))

33 #sorted([p1, p2, p3, p4], key=attrgetter('age'))

enumerate和zip:

1 #enumerate(iterable, start=0)

2 #用于循环中,同时得到iterable的值和计数

3 lst = ['Edward', 'Tang', 'Wang', 'Hu']4 for index, item inenumerate(lst):5 print(index, item)6

7 #zip(iter1 [,iter2 [...]])

8 #分别从iter中取下标相同的元素构成tuple,再将各tuple构成list

9 #使用zip(*list) 做相反的操作

10 x = [1, 2, 3]11 y = [4, 5, 6]12 z = [7, 8, 9]13 w =zip(x, y, z)14 print(list(w)) #[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

15 #用在循环中

16 for a, b, c inzip(x, y, z):17 print(a, b, c)

四、迭代器与生成器

1、迭代器:

a.通过iter()构造一个迭代器,然后就可以通过__next__()来访问下一个元素:

1 a = iter([3, 6, 1, 9])2 a.__next__() #3

3 a.__next__() #6

b.迭代器只能往前,不能后退,且只能从头到尾依次访问

c.当数据量很多时,用迭代器来遍历,因为迭代器读取数据时,不是把所有的数据都加载到内存中,而是读取到某个元素时才开始

d.可迭代对象:

Python内置了很多可迭代对象,如list, dic, str等,所有我们可以通过for循环方便地遍历每一个元素,可以通过collections模块的Iterable来判断是否是可迭代的:

1 from collections importIterable2 lst = [1, 5, 6, 9]3 isinstance(lst, Iterable) #True

2、生成器:

当协同程序暂停的时候,可以获得其中一个的返回值,当调用回到程序中时,能够传入额外或者改变了的参数,但仍能够从上次离开的地方继续

a.通过()构造一个生成器,和迭代器类似,再通过__next()__来访问下一个元素:

1 a = (x * x for x in range(1, 10))2 print(a.__next__()) #1

3 print(a.__next__()) #4

b.yeild:用在函数中,类似于return(只是暂停下来,需要通过__next__()或next(f)访问)

1 deffunc(n):2 a = 1

3 while a

python入门之函数结构第二关_Python入门二:函数相关推荐

  1. python入门之函数调用第二关_Python入门之函数调用——第2关:函数正确调用 - 得到想要的结果...

    任务描述 函数被定义后,本身肯定不会自动执行的,只有在被调用后,函数才会被执行,得到相应的结果. 本关的目标是让读者了解并掌握函数调用的相关知识. 相关知识 定义函数与调用函数的顺序 在定义了函数之后 ...

  2. python入门之函数调用第3关_Python入门到入土!史上最详细的函数教程!

    函数代码块以 def 关键词开头,后接函数标识符名称和圆括号(). 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数. 函数的第一行语句可以选择性地使用文档字符串-用于存放函数说明. ...

  3. python函数的基础知识_Python入门基础知识点(函数进阶)

    动态参数: 动态接收位置参数: def eat(*args): #在形参位置,*叫做聚合 print('我想吃',args) eat('大米饭','中米饭','小米饭') #收到的结果是一个tuple ...

  4. python入门之函数结构函数的参数_Python 基础之函数初识与函数参数

    一.函数初识 定义:满足某一个方法 满足某一个功能#(1)功能(包裹一部分代码 实现某一个功能 达成某一个目的)#(2)可以反复调用,提高代码的复用性,提高开发效率,便于维护管理#(3)函数的基本格式 ...

  5. python使用什么来表示代码块_Python入门之基本语法

    之前有自学python,用的是 python编程从入门到实践 这本教材,个人觉得还挺好使的,适合零基础的同学.但学过之后,就忘的差不多了,编程这件事在于实践,一天不练手就会觉得生疏.刚好借这个机会,把 ...

  6. python基础函数及用法意思_Python基础之函数基本用法与进阶详解

    本文实例讲述了Python基础之函数基本用法与进阶.分享给大家供大家参考,具体如下: 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数 ...

  7. Python外壳:代码结构!(推导式和函数 )

    推导式: 推导式是一个或者多个迭代器快速简洁的创建数据结构的一种方法. 它可以将循环和条件判断结合,从而避免语法冗长的代码. 悄悄告诉你,会使用推导式.很大程度上说明,你已经超过许多初学者啦· 也就是 ...

  8. python中求包含5的数_Python 内置函数 ( ) 可以返回列表、元组、字典、集合、字符串以及 range 对象中元素个数。_学小易找答案...

    [简答题]实例1:求两数相除的结果. 先后输入2个数据,计算第一个数除以第二个数的结果. 要求能够处理输入数据为非数字.除数为零.文件末尾EndOfFile 和用户使用Ctrl + C 命令终止程序等 ...

  9. python函数type的用意_Python内置函数Type()函数一个有趣的用法

    Python内置函数Type()函数一个有趣的用法 今天在网上看到type的一段代码 ,然后查了一下文档,才知道type还有三个参数的用法. 以前只是知道type可以检测对象类型.然后发现了一个有趣的 ...

  10. python函数传值还是地址_python中给函数传参是传值还是传引用

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...

最新文章

  1. Mac下Jekyll安装
  2. VTK:可视化之LabelContours
  3. C#异常处理机制初步
  4. 数据挖掘学习指南!!
  5. 人工智能感知技术是机器人应用支撑技术之一
  6. Git(12)-- Git 分支 - 分支简介
  7. python字典实现好友管理系统简易版
  8. 配置 Exchange ActiveSync 身份验证
  9. CKEditor富文本编辑器使用
  10. java初学者看什么书比较好
  11. Oracle官网登录下载资源账号
  12. java 添加图片到word中,并导出word到前端
  13. 百度AI开放平台[Python]
  14. 分享下nas使用技巧,以及最简单的远程开机(用HS-200S做演示)
  15. u8转完看不到菜单_用友U8软件菜单和导航有功能不能正常显示,如何解决?
  16. 怎么把桌面文件发到计算机文件夹E,怎么把桌面文件默认到d盘
  17. MAC修改主机名、计算机名
  18. 4.list和tuple的使用
  19. i2c-tool调试工具使用方法介绍
  20. [前端] Node.js + Web Socket 打造即时聊天程序嗨聊

热门文章

  1. Win7忘记开机密码解决办法
  2. 华工计算机专业在哪个校区,华南理工大学数学
  3. 面向对象的系统分析(一)-系统分析方法
  4. tunel凋亡试剂盒说明书_TUNEL细胞凋亡试剂盒内容及操作步骤(精)
  5. 五个脑叶的功能_人类大脑的生理构造及功能分区
  6. java约等于符号_markdown常见数学符号和运算
  7. 万年历程序中十二生肖排列顺序及算法
  8. 涨见识!Java String转int还有这种写法
  9. 程序员创业:从有想法 - 公司注册 - 项目路演 - 一对一投资人商谈
  10. linux硬盘格式化物理卷,创建物理卷报错Can't open /dev/sdb5 exclusively. Mounted filesystem的问题解决过程记录......