1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Python-用户自定义函数的定义 调用 引用 装饰器

Python-用户自定义函数的定义 调用 引用 装饰器

时间:2023-12-19 18:12:04

相关推荐

Python-用户自定义函数的定义 调用 引用 装饰器

所谓函数,就是把具有独立功能的代码块组织成一个小的模块,在需要的时候进行调用。提高开发的效率和代码的重用。

在程序中多次执行同一项任务时,你无需反复编写该任务的代码,只需要调用该函数,让python运行其中的代码。

函数的使用包含两个步骤:定义函数--封装独立的功能。调用函数--享受封装的成果。

定义函数

函数代码块以def关键字开头,def是英文define的缩写,后接函数名称和圆括号()

函数名称的命名应该符合标示符的命名规则:由字母、数字、下划线组成,不能以数字开头,不能与关键字重名

参数传递

传入的参数和变量放在圆括号()中,增加函数的通用性,适应更多的数据。

形参和实参

形参:定义函数时,小括号中的参数,是用来接收参数用的,在函数内部作为变量使用

实参:调用函数时,小括号中的参数,是用来把数据传递到函数内部用的

例:# _*_ coding:utf-8 _*_# 定义函数def sum_2_sum(num_1,num_2):result = num_1 + num_2print '%d + %d = %d' % (num_1,num_2,result)# 调用函数sum_2_sum(23,432)# 输出结果23 + 432 = 455

函数的返回值

返回值是函数完成工作后,最后给调用者的一个结果。在函数中使用return关键字可以返回结果。调用函数的一方可以使用变量来接受函数的返回结果

例:# _*_ coding:utf-8 _*_# 定义函数def sum (num1,num2):total = num1 + num2return total ## 返回变量total的值# 调用函数num = sum(33,32) ## 返回值赋予变量numprint num# 输出结果65

局部变量和全局变量

局部变量是在函数内部定义的变量,只能在函数内部使用

全局变量是在函数外部定义的变量,(没有定义在某一个函数内),所有函数内部都可以使

用这个变量

局部变量

局部变量是在函数内部定义的变量,只能在函数内部使用

函数执行结束后,函数内部的局部变量,会被系统回收

不同的函数,可以定义相同的名字的局部变量,但是各用各的不会产生影响

局部变量的作用

在函数内部使用,临时保存函数内部需要使用的数据

例:# _*_ coding:utf-8 _*_total = 3 ## 定义全局变量totaldef sum (num1,num2):total = num1 + num2## 函数内的局部变量totalprint "函数内的total:",totalsum(33,32)print "函数外的total:",total# 输出结果函数内的total: 65函数外的total: 3

声明变量:global

一个函数内的变量如果想要在函数之外使用,可以使用global来声明此变量,使其变为全局变量

# _*_ coding:utf-8 _*_total = 3def sum (num1,num2):total = num1 + num2print "函数内的total:",totalglobal total## 声明变量total为全局变量sum(33,32)print "函数外的total:",total# 输出结果函数内的total: 65函数外的total: 65 ## 函数外的变量total被更新

导入模块:import

每一个python源文件都可以是一个模块文件,可以在一个python文件中定义函数或变量,然后在另一个文件中import filename导入这个模块,导入后就可以以 模块名.变量名or函数名的方式,使用这个模块中定义的函数和变量了。

例:# module文件# _*_ coding:utf-8 _*_"""file:module.pyauthor: Jinxdesc:"""def say_hello(name):## module文件中的函数print "Hello,%s" % name# 导入文件"""file:test.pyauthor: Jinxdesc:测试文件"""import module ##导入module文件module.say_hello('jinx') ##使用module文件中的函数# 输出结果Hello,jinx

装饰器

将一个函数当作参数,传递给另一个函数,在不改变原函数的基础上,给函数增加内容,返回一个加强版的函数,我们称之为装饰器

# _*_ coding:utf-8 _*_"""file:装饰器.pyauthor: Jinxdesc:"""def func1(): # 定义函数1print "Have a nice day!"def func2(): # 定义函数2print "Hello world!"def outer(func):# 装饰器,对原函数增加内容def inner():print '#################'func()print '#################'return inner# 返回一个函数,没有括号# 检验调用函数a = outer(func1)a()b = outer(func2)b()# 输出结果#################Have a nice day!##################################Hello world!#################

综合应用——名片管理系统

card_main.py

# _*_ coding:utf-8 _*_import cards_tools#无限循环,由用户主动决定什么时候退出while True:#TODO注释,用于标记需要去做的工作cards_tools.show_menu()action_str = raw_input("请选择希望执行的操作: ")print("你选择的操作是 %s" % action_str)#1,2,3针对名片的操作if action_str in ["1","2","3"]:if action_str == "1":cards_tools.new_card()elif action_str == "2":cards_tools.show_all()elif action_str == "3":cards_tools.search_card()#0退出系统elif action_str == "0":print("欢迎再次使用【名片管理系统】:")break#如果在开发程序时,不希望立刻编写分支内部的代码#可以使用pass关键字,表示一个占位符,能够保证程序的代码结构正确#运行程序时,pass关键字不会执行任何操作else:print("输入错误,请重新输入:")

cards_tools.py

# _*_ coding:utf-8 _*_card_list = []def show_menu():"""显示菜单"""print '*' * 50print '欢迎使用【名片管理系统】'print ''print '1.新增名片'print '2.显示全部'print '3.搜索名片'print '0.退出系统'print '*' * 50def new_card():"""新增名片"""print '-' * 50print '新增名片'# 1.提示用户输入名片的详细信息name_str = raw_input('请输入姓名:')phone_str = raw_input('请输入电话:')qq_str = raw_input('请输入QQ:')email_str = raw_input('请输入邮箱:')# 2.使用用户输入的信息建立一个名片字典card_dict = {'name_str': name_str,'phone_str': phone_str,'qq_str': qq_str,'email_str': email_str}# 3.将名片字典添加到列表中card_list.append(card_dict) # 把一个字典追加到一个列表中print card_list# 4.提示用户添加成功print '添加%s 的名片成功' % name_strdef show_all():"""显示所有名片"""print '-' * 50print '显示所有名片'# 判断是否存在名片记录,如果没有,提示用户并且返回if len(card_list) == 0:print '当前没有任何的名片记录,请使用新增功能添加名片'# return 可以返回一个函数的执行结果# 下方的代码不会被执行# 如果return后面没有任何的内容,表示会返回到调用函数的位置# 并且不返回任何结果return# 打印表头for name in ["姓名", "电话", "QQ", "邮箱"]:print name,print ''# 打印分隔线print '=' * 50# 遍历名片列表依次输出字典信息for card_dict in card_list:# print card_dictprint '%s\t\t%s\t\t%s\t\t%s' % (card_dict['name_str'],card_dict['phone_str'],card_dict['qq_str'],card_dict['email_str'])def search_card():"""搜索名片"""print '-' * 50print '搜索名片'# 1.提示用户输入要搜索的姓名find_name = raw_input('请输入要搜索的姓名:')# 2.遍历名片列表,查询要搜索的姓名,如果没有找到,需要提示用户for card_dict in card_list:if card_dict['name_str'] == find_name:print '姓名 电话 QQ 邮箱'print '=' * 50print '%s %s %s %s' % (card_dict['name_str'],card_dict['phone_str'],card_dict['qq_str'],card_dict['email_str'])# TODO 针对找到的名片记录执行修改和删除的操作# 在我们的日常编写程序中,如果一个函数的代码太多,阅读和编写都是一件困难的事情,而在开发中,可以针对一个具体独立的功能来封装一个函数,由这个函数来处理具体的操作,这样就能保证每个函数中的代码清晰明了,功能明确deal_card(card_dict)breakelse:print '抱歉,没有找到%s' % find_namedef deal_card(find_dict):print find_dictaction_str = raw_input('请选择要执行的操作 ''[1] 修改 [2] 删除 :')# 替换已经存在的键值对if action_str == '1':find_dict['name_str'] = input_card_info(find_dict['name_str'], '姓名:')find_dict['phone_str'] = input_card_info(find_dict['phone_str'], '电话:')find_dict['qq_str'] = input_card_info(find_dict['qq_str'], 'QQ:')find_dict['email_str'] = input_card_info(find_dict['email_str'], '邮箱:')print '修改名片成功!!!'elif action_str == '2':card_list.remove(find_dict)print '删除名片成功!!!'def input_card_info(dict_value, tip_message):""":param dict_value:字典中原有的值:param tip_message:输入的提示文字:return:如果用户输入了内容,就返回内容,负责返回字典中原有的值"""# 1.提示用户输入内容result_str = raw_input(tip_message)# 2.针对用户的输入进行判断,如果用户输入了内容,直接返回结果if len(result_str) > 0:return result_str# 3.如果用户没有输入内容,返回‘字典中原有的值’else:return dict_value

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。