一:Python 自定义函数
函数示意图如下:
1、使用函数的好处
- 代码重用
- 保持一致性,易维护
- 可扩展性
2、函数定义
- 函数定义的简单规则
- 函数代码块以def关键词开头
- 后接函数标识符名称和圆括号(),名称不能用纯数字或值python保留字符定义
- 任何传入参数和自变量必须放在圆括号中间函数内容以冒号起始,并且缩进若有返回值
- 函数通常使用三个单引号 '''...''' 来注释说明函数;函数体内容不可为空,可用 pass 来表示空语句
- 语法如下
- 函数名称定义的要求
- 不要以纯数字命名
- 不要以python中保留字符(关键字)来命名
- 不要以文件名命名
- 不能出现特殊字符
- 要简短且见名知义
def 函数名(): 函数体
3、return 返回语句
- 每个函数都有一个 return 返回值,如果没定义则返回 None
- 函数中只要执行到 return 语句,函数就自动结束
- 可以写多个 return 语句但是第二个及之后的 return 语句不会被执行
- 可以通过 return x,y,z 形式返回多个值
def num(a,b): c = int(a) + int(b) return a,b,c
4、参数:
- 形参:写在函数声明的位置的变量量叫形参
- 实参:在函数调⽤的时候给函数传递的值. 叫实参
- 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值.
- 传参:给函数传递信息的时候将实际参数交给形式参数的过程被称为传参
5、参数的分类
- 位置参数
def print_info(name,school): # 定义形参 print("My name is %s" % name) print("I learning software testing in %s" % school) print_info("XiaoWang","ShenZhen Dcs") # 传入实参 # 结果如下 My name is XiaoWang I learning software testing in ShenZhen Dcs
def add(a,b): #括号内为形参 return a+b print (add(2,3)) #括号内为实参 def jian(a,b): return a-b def cheng(a,b): return a*b def chu(a,b): return a/b #求出给定区间的偶数和 def sums(x,y): a = [] for i in range(x,y+1): if i % 2 == 0: a.append(i) return(sum(a))
-
- 示例如下
#统计出字符串中某个字母有多少个 def counts(s,x): print (s.count(x)) #分数评级方法,90分以上:A,70分以上:B,60分以上:C,其他:D
def PG(score): if score > 90: return("A") elif score > 70: return("B") elif score > 60: return("C") else: return("D")
#封装一个功能,实现统计文件内容行数 def count_line(filepath): with open(filepath,"r") as data: return(len(data.readlines()))
#coding=utf-8 """ 封装登录和注册方法进行登录注册要求如下: 先定义一个字典来存放用户名,账号和密码如dic = {'admin': '123456', 'xfs': '234567'} 要求如下: 1、从字典中获取用户完成登入,登入时判断用户是否存在,存在直接登入 2、如果输入的登入用户判断不存在字典,则调用注册方法,完成该用户的注册,注册成功后写入字典 """ dic = {'admin':'123456','xfs':'234567'} def register(): user = input("输入账号:") A = True while A: pwd = input("输入密码:") repwd = input("请确认密码:") if repwd == pwd: dic.setdefault(user,pwd) A = False else: print ("两次密码不一致!") def login(): user = input("请输入账号:") if user in dic.keys(): for i in range(3): pwd = input("请输入密码:") if pwd == dic.get(user): print ("登录成功") break else: print ("密码错误") else: print ("账号不存在,请注册!") register() login()
#coding=utf-8 #封装一个方法,实现人民币和美元汇率转换 def Change(a): if a[:3] == "¥": return("%.4f" % (float(a[3:])/6.78)) elif a[:1] == "$": return ("%.4f" % (float(a[1:])*6.78)) else: return "输入有误!"
- 默认参数
- 默认形参必须接在位置参数后
def print_info(name = "XiaoZhen",school = "ShangHai Dcs"): print("My name is %s" % name) print("I learning software testing in %s" % school) print_info() # 未传实参 print_info("XiaoWang","ShenZhen Dcs") # 重新传了实参 # 结果如下 My name is XiaoZhen I learning software testing in ShangHai Dcs My name is XiaoWang I learning software testing in ShenZhen Dcs
def print_info(name,school = "GuangZhou Dcs"): print("My name is %s" % name) print("I learning software testing in %s" % school) print_info("XiaoWang","ShenZhen Dcs") #结果如下 My name is XiaoWang I learning software testing in ShenZhen Dcs
# 默认参数在位置参数前
def print_info(name = "XiaoZheng",school): # 此时默认参数在位置参数前,代码会提示报错
print("My name is %s" % name)
print("I learning software testing in %s" % school)
- 可变长参数
- 建议可变长参数放在默认参数后
def abc(x,*y): return x,y abc(1,2) abc(1,2,3,4,5,6)
def abc(*args): for i in args: print(i) print(args) #args 中存储了(1, 2, 3, 4, 5) print(*args) #输出的时候加上 * 可以去除() abc(1,2,3,4,5) #结果如下 1 2 3 4 5 (1, 2, 3, 4, 5) 1 2 3 4 5
# 将可变长参数放在默认参数前 def print_info(name,*args,age = 24,**kwargs): print("My name is %s" % name) print("My teachers are %s" % (str(args))) print("My age is %s" % age) print("I learning software testing in %s" % (kwargs.get("School"))) print_info("XiaoZheng","Qian Sir","Chen Sir","Zheng Sir",27,School="ShenZhen Dcs") # 结果如下 My name is XiaoZheng My teachers are ('Qian Sir', 'Chen Sir', 'Zheng Sir', 27) # 解释器将我传给 age 的实参 27 也当作 args 的参数了 My age is 24 # 我在调用函数时传给 age 的实参未生效 I learning software testing in ShenZhen Dcs
- 关键字参数
- 关键字参数必须放在可变长参数后
def print_info(name,school): print("My name is %s" % name) print("I learning software testing in %s" % school) print_info(school="ShangHai Dcs",name="XiaoZheng") # 第一种传参方式 print_info(**{"name":"XiaoWang","school":"ShenZhen Dcs"}) # 第二种传参方式 info = {"name":"XiaoQian","school":"GuangZhou Dcs"} print_info(**info) # 第三种传参方式 # 结果如下 My name is XiaoZheng I learning software testing in ShangHai Dcs My name is XiaoWang I learning software testing in ShenZhen Dcs My name is XiaoQian I learning software testing in GuangZhou Dcs
def abc(x,**kwargs): return x,kwargs #传参方式如下 stu = {"name":"zhangsan","age":20} print (abc(1,**stu)) print (abc(1,name="zhangsan",age=20)) print (abc(1,**{"name":"zhangsan","age":20}))
# 关键字参数放在可变长参数后 def print_info(name,age = 24,*args,**kwargs): print("My name is %s" % name) # 位置参数 print("My age is %s" % age) # 默认参数 print("My teachers are %s" % (str(args))) # 可变长参数 print("I learning software testing in %s" % (kwargs.get("School"))) # 关键字参数 print_info("XiaoZheng",27,"Qian Sir","Chen Sir","Zheng Sir",School="ShenZhen Dcs") # 结果如下 My name is XiaoZheng My age is 27 My teachers are ('Qian Sir', 'Chen Sir', 'Zheng Sir') I learning software testing in ShenZhen Dcs # 关键字参数放在可变长参数前 def print_info(name,age = 24,**kwargs,*args): # 代码会提示报错 print("My name is %s" % name) print("My age is %s" % age) print("My teachers are %s" % (str(args))) print("I learning software testing in %s" % (kwargs.get("School")))
6、作用域(局部变量和全局变量)
- 局部变量是在函数内部定义的变量,只能在函数内部使用,函数执行结束后,函数内部的局部变量,会被系统回收不同的函数,不同函数可以定义相同的名字的局部变量,但是各用各的不会产生影响
- 全局变量是在函数外部定义的变量,(没有定义在某一个函数内),所有函数内部都可以使用这个变量