python(函数封装)

一: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、作用域(局部变量和全局变量)

  • 局部变量是在函数内部定义的变量,只能在函数内部使用,函数执行结束后,函数内部的局部变量,会被系统回收不同的函数,不同函数可以定义相同的名字的局部变量,但是各用各的不会产生影响
  • 全局变量是在函数外部定义的变量,(没有定义在某一个函数内),所有函数内部都可以使用这个变量
原文地址:https://www.cnblogs.com/ZhengYing0813/p/11754411.html