本节内容分为两部分讲涉及内容有点多:函数及模块,大纲如图所示!
4.函数和模块.png
为更好的对整篇进行理解粗略的画了此图
image.png
1、函数的定义
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
编程大师Martin Fowler先生曾经说过:“代码有很多种坏味道,重复是最坏的一种!”,要写出高质量的代码首先要解决的就是重复代码的问题。
函数的命名规则和前面讲到的变量的命名规则一样
2、调用函数
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
def 函数名(参数):
函数体
#demo
def hello():
print('hello')
def hello1(name):
print('hello ', name)
hello()
hello1('python')
为巩固上节知识点,给出两种用Python计算阶乘的方法(4的阶乘答案为24)
def factorial(num):
"""
求阶乘(递归方式)
:return: num的阶乘
"""
if (num <= 1 ):
return 1
else:
return factorial(num - 1) * num
### 当需要计算阶乘的时候不用再写直接调用已经定义好的函数
def factorial1(num):
"""
求阶乘普通方式
:return: num的阶乘
"""
result = 1
if (num <= 1):
return 1
else:
for n in range(1, num + 1):
result *= n #result =result* n
return result
print(factorial1(4))
3、函数参数
函数可以有参数,也可以没有参数
- 必需参数 :def demo( name,age)
- 默认参数:def demo( age=18 )
- 不定长参数:def demo(*args)
注意
- 1、*args 和 **kwargs 主要用于函数定义。
你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *才是必须的. 你也可以写成 *ar 和 *k 。而写成 args 和kwargs 只是一个通俗的命名约定。- 2、python函数传递参数的方式有两种:
位置参数(positional argument)
关键词参数(keyword argument)- 3、*args 与 **kwargs 的区别,两者都是 python 中的可变参数:
*args: 本质是一个 tuple(任何多个无名参数)
**kwargs :本质上是一个 dict(关键字参数)
如果同时使用 *args 和 **kwargs 时, *args 参数列要在 **kwargs 之前。
4、匿名函数
python 使用 lambda 来创建匿名函数。
返回值就是该表达式的结果。
语法:lambda 参数:方法(或三元运算)
numLambda = lambda a, b : a + b
print(numLambda(1, 2)) #输出结果为:3
a = list(range(3))
print(list(map(lambda x: x * x, a))) # 输出结果为:[0, 1, 4]
5、迭代器
1、迭代器是访问集合元素的一种方式,可以记住遍历的位置的对象。(字符串、列表、元组、字典、集合都可以被for循环,说明他们都是可迭代的)
迭代器有两个基本的方法:iter() 生成迭代器和 next()遍历迭代器元素。
isinstance() 类型判断。isinstance(a,Iterable) 判断a 是否是可迭代对象。
listName = [1, 2, 3, 4]
nums = iter(listName) # 创建迭代器对象
print(next(nums)) # 1输出迭代器的下一个元素
print(next(nums)) # 2输出迭代器的下一个元素
listName = [1, 2, 3, 4]
it = iter(listName) # 创建迭代器对象
for x in it:
print(x, end=" ")
#输出结果为 1 2 3 4
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 6:
x = self.a
self.a += 1
return x
else:
raise StopIteration # 用于表示迭代器的完成,防止出现无限循环的情况
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter)) # 1
print(next(myiter)) # 2
print(next(myiter)) # 3
for x in myiter:
print(x)
print(isinstance([1, 2, 3], list)) # 判断数据类是否为list
#循环结果输入只能到6 输出结果为 1 2 3 4 5 6
6、生成器
使用了 yield 的函数被称为生成器
def myList(n):
for i in range(n):
yield(i)# 把之前的print(i) 换成yield(i)就为生成器了
print(myList(4))
for i in myList(4):
print(i)
网友评论