Python 【系列教程】之函数和lambda表达式
【摘要】 一、定义函数和调用函数
在使用函数之前必须先定义函数,定义函数的语法格式如下:
def 函数名(形参列表): //由零条到多条可执行语句组成的函数 [return [返回值]]
python 的声明函数必须使用def关键字。
# 函数的定义def my_max(x, y): z = x if x >...
一、定义函数和调用函数
在使用函数之前必须先定义函数,定义函数的语法格式如下:
-
def 函数名(形参列表):
-
//由零条到多条可执行语句组成的函数
-
[return [返回值]]
python 的声明函数必须使用def关键字。
-
# 函数的定义
-
def my_max(x, y):
-
z = x if x > y else y
-
return z
-
-
-
def say_hi(name):
-
print("====正在执行say_hi()函数====")
-
return name + ",您好!"
-
-
-
a = 6
-
b = 9
-
-
print(my_max(a, b))
-
print(say_hi("段赵旭"))
-
-
-
# 函数说明文档:只要把一段字符串放在函数声明之后,函数体之前,这段字符串将被作为函数的部分,这个文档就是
-
# 函数的说明文档
-
# 程序即可通过help()函数查询函数的说明文档,也可通过函数的_doc_属性访问函数的说明文档。下面程序示范了为函数
-
# 编写说明文档
-
def my_max(x, y):
-
"""
-
获取两个数值之间较大数的函数
-
:param x:
-
:param y:
-
:return:
-
"""
-
# 定义一个变量z,该变量等于x,y中较大的值
-
z = x if x > y else y
-
return z
-
-
-
help(my_max)
-
print(my_max.__doc__)
-
-
-
# 多个返回值,被自动封装成元组的形式返回
-
def sum_and_avg(list):
-
sum = 0
-
count = 0
-
for e in list:
-
if isinstance(e, int) or isinstance(e, float):
-
count += 1
-
sum += e
-
return sum, count
-
-
-
my_list = [20, 15, 2.8, 'a', 35, 5.9, -1.8]
-
# 元组的形式
-
tp = sum_and_avg(my_list)
-
print(tp)
-
# 使用序列解包的形式
-
s, avg = sum_and_avg(my_list)
-
print(s)
-
print(avg)
-
-
-
# 递归函数
-
def fn(n):
-
if n == 0:
-
return 0
-
elif n == 1:
-
return 1
-
else:
-
return n * fn(n - 1)
-
-
-
print("fn(10)的结果是:", fn(3))
-
-
-
# 函数关键字的使用
-
def grith(width, height):
-
print("width:", width)
-
print("height:", height)
-
return 2 * (width + height)
-
-
-
print(grith(3.5, 4.8))
-
print(grith(width=3.5, height=4.8))
-
print(grith(height=4.8, width=3.5))
-
print(grith(3.5, height=4.8))
-
-
-
# 关键字参数必须位于位置参数之后,否则报错
-
# print(grith(width=3.5,4.8))
-
-
# 参数默认值
-
def say_hi(name="孙悟空", message="欢迎来到疯狂软件"):
-
print(name, ",您好")
-
print("消息是:", message)
-
-
-
# 全部使用默认参数
-
say_hi()
-
# 只有message参数使用默认值
-
say_hi("白骨精")
-
# 两个参数都不使用默认值
-
say_hi("白骨精", "123")
-
# 只有name参数使用默认值
-
say_hi(message="欢迎学习python")
-
-
-
# 定义函数的时候也是一样,默认值参数必须放到位置参数之后
-
# def test(name="zhangsan",age):
-
-
-
# 个数可变的参数
-
def test(a, *books):
-
print(books)
-
for b in books:
-
print(b)
-
print(a)
-
-
-
test(5, "疯狂ios讲义", "疯狂android讲义")
-
"""输出可以看到可变参数传入到函数之后封装成了元组
-
('疯狂ios讲义', '疯狂android讲义')
-
疯狂ios讲义
-
疯狂android讲义
-
5"""
-
-
-
# 定义了支持参数收集的函数
-
def test(x, y, z=3, *books, **scores):
-
print(x, y, z)
-
print(books)
-
print(scores)
-
-
-
test(9, 8, 3, "asd", "asd", 语文="sad", 数学="math")
-
"""输出
-
9 8 3
-
('asd', 'asd') 可变长参数变成了元组
-
{'语文': 'sad', '数学': 'math'} 可变长关键字参数变成了字典
-
"""
-
-
-
def test(name, message):
-
print()
-
print()
-
-
-
my_list = ['孙悟空', '欢迎来到疯狂软件']
-
test(*my_list)
-
-
-
# 逆向参数收集
-
def foo(name, *nums):
-
print("name参数:", name)
-
print("nums参数:", nums)
-
-
-
my_tuple = (1, 2, 3)
-
foo("asd", *my_tuple)
-
-
-
# 字典关键字参数:程序使用逆向收集即可将my_dict包含的三个kv对以关键字参数的形式传给
-
# bar()函数
-
def bar(book, price, desc):
-
print(book, "这本书的价格是:", price)
-
print('描述信息', desc)
-
-
-
my_dict = {'price': 89, 'book': '疯狂python讲义', 'desc': '这是一本系统全面的python学习图书'}
-
bar(**my_dict)
-
-
# 变量作用域
-
"""python提供了如下的三个工具函数来获取指定范围内的变量字典
-
globals() 该函数返回全局范围内所有变量组成的变量字典
-
locals() 该函数返回当前局部范围内所有变量组成的变量字典
-
vars(object) 获取在指定对象范围内所有变量组成的变量字典,如果不传入object
-
参数,vars()和locals()的作用完全相同
-
"""
-
-
# 在函数中声明全局变量
-
name = 'Charlie'
-
-
-
def test():
-
# 声明name是全局变量,后面的赋值语句不会重新定义局部变量
-
global name
-
# 直接访问name全局变量
-
print(name) # charlie
-
name = "孙悟空"
-
-
-
test()
-
print(name)
-
"""增加了global name声明之后,程序会把name变量当成全局变量,这意味着test()函数后面对name赋值的语句只是对
-
全局变量赋值,而不是重新定义局部变量"""
-
-
-
# 局部函数
-
def get_math_func(type, nn):
-
def square(n):
-
return n * n
-
-
def cube(n):
-
return n * n * n
-
-
def factorial(n):
-
result = 1
-
for index in range(2, n + 1):
-
result *= index
-
return result
-
-
if type == 'square':
-
return square(nn)
-
elif type == 'cube':
-
return cube(nn)
-
else:
-
return factorial(nn)
-
-
-
print(get_math_func('square', 3))
-
print(get_math_func('cube', 3))
-
print(get_math_func('factorial', 3))
-
-
-
def foo():
-
# 局部变量name
-
name = 'Charlie'
-
def bar():
-
#bar函数中就不必在重新定义name变量,就可以直接访问foo函数中的name变量了
-
nonlocal name
-
# 访问bar()函数所在foo()函数内的name局部变量
-
print(name)
-
name = '孙悟空'
-
print(name)
-
bar()
-
foo()
-
"""nonlocal和前面的global功能大致类似,区别是global用于声明访问全局变量,而
-
nonlocal用于声明访问当前函数所在函数内的局部变量"""
二、函数的高级内容
-
# 使用函数变量
-
def pow(base, exponent):
-
result = 1
-
for i in range(1, exponent + 1):
-
result *= base
-
return result
-
my_fun = pow
-
print(my_fun(3, 4))
-
def area(x, y):
-
return x * y
-
my_fun = area
-
print(my_fun(3, 4))
-
-
-
def map(data,fn):
-
return fn(data,data)
-
print(map(5,my_fun))
-
#函数可以作为变量,参数,以及函数的返回值
-
-
-
#局部函数没有太大的意义,那么就考虑使用lambda表达式来简化局部函数的写法。
-
def get_math_func(type):
-
result = 1
-
#该函数返回的是lambda表达式
-
if type == 'sq':
-
return lambda n:n*n
-
elif type == 'cube':
-
return lambda n:n*n*n
-
else:
-
return lambda n:(1+n)*n/2
-
"""lambda表达式只能是单行表达式,不允许使用更加复杂的函数形式,
-
lambda表达式的语法格式如下:
-
lambda [参数列表]: 表达式
-
"""
-
x=map(lambda x:x*x,range(8))
-
print([e for e in x])
-
y=map(lambda m:m*m if m%2==0 else 0,range(8))
-
print([e for e in y])
文章来源: blog.csdn.net,作者:血煞风雨城2018,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq_31905135/article/details/100534479
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)