Python(三)–函数

函数

  • 无参函数:
def 函数名称():
    代码块
return [表达式]

以关键词def开始,后面跟函数名和小括号,以冒号开头并缩进,最后使用return退出函数,有表达式则传递返回值,没有则返回None.
无参函数的调用语法: [变量] = 函数名称()
使用复制运算符”=”可以获得函数的返回值,使用时必须先定义再调用,否则程序出现错误.
实例九九乘法表:

def nineMultiTab():
    for i in range(1,9):
        for j in range(1,9):
            print i,"*",j,"=",i*j
    return
nineMultiTab()

一个简易的登录系统:

kg = {}
def newUser(): #注册
    user = raw_input("Please input user:")
    while True:
        if(kg.has_key(user)):
            print "name taken,try again"
        else:
            break
    password =raw_input("Please input password:")
    kg[user] = password

def oldUser():#登录
    user = raw_input("Login username:")

    if(kg.has_key(user)):
        password = raw_input("password:")
        if (password == kg.get(user)):
            print "--welcome back--", user
        else:
            print "--password error--"
    else:
        print "invalid user"


def showMenu(): #定义菜单
    prompt = '''
        (N)ew User Login
        (E)ntering User Login
        (Q)uit
    Enter choice:
    '''
    while True:
        choice = raw_input(prompt).strip()[0].lower()
        print "\n--You picked:[%s]" % choice
        if choice not in "neq":
            print "--invalid option ,try again--"
        else:
            if choice == "n":
                newUser()
            elif choice == 'e':
                oldUser()
            else:
                print "quit"
                break

showMenu()
  • 代参函数:
def 函数名称 (形式参数列表):
    代码块
    return [表达式]

示例:

def aa(x,y):
    return x,y
print aa(1, 3)
print aa(y=10,x = 9)

当程序比较繁琐时,参数的顺很难记住,可以使用关键字参数.
还可以定义默认参数:

def aa(x,y = 4):
    return x,y
print aa(3)

注意:定义关键字参数默认值时需要注意,位置参数必须出现在默认参数之前.
错误例子:

def bb(x = 1,y):
    print x,y

一个简单的计算器:

def calculate(data1,data2,op):
    if op not in "+-*/":
        return "operator error"
    else:
        if op == "+":
            return convert(data1)+convert(data2)
        elif op == "-":
            return convert(data1)-convert(data2)
        elif op == "*":
            return convert(data1)*convert(data2)
        else:
            if(data2 != 0):
                return convert(data1)/convert(data2)
            else:
                return "divisior can not be 0!"

def convert(data):
    flag = True
    for ch in data:
        if ch not in "123456790":
            flag = False
            break
    if flag:
        return int(data)
    else:
        return "data = "+data+" is invalid "

def inputExpress():
    while True:
        print "(Q)uit"
        data1 = raw_input("input data1:")
        if data1.strip()[0].lower() == "q":
            break
        operator = raw_input("input operator:")
        data2 = raw_input("input data2:")
        if data2.strip()[0].lower() == "q":
            break
        print calculate(data1, data2, operator)

inputExpress()
  • 变量作用域
    变量声明的位置决定它的作用域,python按作用域区分为局部变量和全局变量.
    全局变量: 指在一个模块中最高级别的变量有全局作用域,除非被删除,否则存活到程序运行结束,所有函数都能访问全局变量.
    局部变量: 指定义在函数内部的变量有局部作用域,依赖于定义变量的函数现阶段是否处于活动状态,调用函数时,局部变量产生,暂时存在.一旦函数执行完,局部变量将会被释放.
    注意: 在同一个函数中,不允许有同名局部变量.在不同的函数中,可以有同名局部变量.在同一个程序中,全局变量和局部变量同名时,局部变量具有更高的优先级.
    特别的: 若想在函数内定义全局变量,可以用global关键字解决,global声明的变量是全局变量.
  • lambda函数:
    lambda函数的作用是创建匿名函数.
lambda 参数列表:函数返回值的表达式

示例:

def sum1(x,y):
    return x+y
sum2 = lambda x,y:x+y
print sum1(1,2)
print sum2(1,2)

注意:使用lambda只能是表达式,不能包含if,for等条件循环语句,对于不需要服用的简单匿名函数,使用lambda能起到很好的效果.

  • 内联函数
    内联函数是程序员经常使用到的方法,曾加程序编写的效率,如float()就是内联函数.内联函数是自动加载的,python的解释器可以识别.它不需要导入模块,不必做任何的操作.,不需要引用就可以调用.
  • abs(x) 能够返回一个数字的绝对值.
  • bool([x]) 参数为数字时,0返回False,其他返回True.参数为字符串数时,None或空字符串反水False,否则返回True.参数为空的列表,元组或字典时,返回False,否则返回True.
  • float([x]) 用于转换数据为float类型.参数可以为字符串或数字.
  • int([x,[base]) 第一个参数为转换的数据,第二个参数为进制.默认为十进制.如果采纳数含有浮点数的字符串,将会产生语法错误.
  • range([start],stop[,step]) 可以产生一个列表.第一个参数start表示起始值,是可选参数,默认值为0.第二个参数stop表示终止值,第三个参数表示步长,是可选参数,可以为正数或负数,默认值为1.
  • sum(x[,start]) 可以对列表中的元素求和.第一个参数x是迭代器,第二个参数start是步长,是可选参数,默认值是1.
  • max(x) 可以返回列表,元组或字符串中最大的元素.
  • min(x) 可以返回列表,元组或字符串中最小的元素.
  • dir([object]) 可以返回关于任何值的相关信息,可以用于任何对象(包括字符串,数字,函数,模块,对象和类).
  • eval(expression[,globals[,lobals]]) 可以计算表达式的值.
    print eval(“9*52+1*(1+2)”)
  • len(s) 返回一个对象的长度.对于字符串返回字符个数,元组列表和字典反水大慧寺元素的个数.
  • exec(object[,globals[,lobals]]) 可以运行较复杂的程序,与eval()函数功能相近,二者的区别是exec()没有返回值,而eval()有返回值.
program = '''print('ww');print('ss')'''
exec(program)