python函数

函数

定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

函数定义规则:

你可以定义一个由自己想要功能的函数,以下是简单的规则:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()

  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。

  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。

  • 函数内容以冒号起始,并且缩进。

  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

语法:

def functionname(参数):
    函数方法
    return 返回值
  • 形参与实参定义

形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值

def clac(x,y):  #x,y 为形参
    res=x**y
    return res
​
c=clac(1,2)  # 1,2 为实参
print(c)
  • 默认参数

调用函数时,缺省参数的值如果没有传入,则被认为是默认值。

例子:

def printinfo(name,age=35):
    print("Name:",name)
    print("Age:",age)
    return ;
printinfo("miki",50)
printinfo("miki")
结果为:
Name: miki
Age: 50
Name: miki
Age: 35
  • 关键参数

    正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可,但记住一个要求就是,关键参数必须放在位置参数之后

  • 非固定参数

    若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数

    • *args

      def printinfo(arg1,*args):
          print(arg1)
          print("============")
          for i in args:
              print(i)
          return ;
      ​
      printinfo(10)
      ​
      printinfo(90,80,70,60,50)
      ​
      输出结果
      10
      ============
      90
      ============
      80
      70
      60
      50
    • **kwargs

      def stu_register(name,age,*args,**kwargs):
          print(name,age,args,kwargs)
      ​
      stu_register("xiaoming",22)
      stu_register("jack",22,"CN","python",sex="male",province="shandong")
      ​
      结果为:
      xiaoming 22 () {}
      jack 22 ('CN', 'python') {'province': 'shandong', 'sex': 'male'
  • 匿名函数

    python 使用 lambda 来创建匿名函数。

    • lambda只是一个表达式,函数体比def简单很多。

    • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。

    • lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。

    • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

      sum=lambda arg1,arg2:arg1+arg2;
      print("相加后的值为:",sum(10,20))
      print("相加后的值为:",sum(20,20))
      ​
      输出结果:
      相加后的值为: 30
      相加后的值为: 40
      ​
      res=map(lambda x:x**2,[1,3,4,7,9])
      for i in res:
          print(i)
      输出结果为:
      1
      9
      16
      49
      81 
  • 变量作用域

    一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。

    变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域如下:

    • 全局变量

    • 局部变量

    定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

    局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:

    total=10  #全局变量
    def sum(arg1,arg2):
        total=arg1+arg2  #局部变量
        print("函数局部变量是:",total)
        return total
    ​
    sum(10,20)
    print("函数外全局变量是:",total)
    ​
    结果为:
    函数局部变量是: 30
    函数外全局变量是:10

全局变量想作用与函数内,需在全局变量前面加global

total=0
def prin_total():
    print(total)
def setoal():
    global total #使用global声明全局变量
    total=1
    return total
prin_total()  
print(setoal())
print(total)
  • 递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

递归特性:

  1. 必须有一个明确的结束条件

  2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

  3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

例子:

def calc(n):
    print(n)
    if int(n/2)==0:
        return n
    return calc(int(n/2))
calc(10)
​
结果为:
10
5
2
1

二分查找

data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
​
def find_num(dataset,num):
    if len(dataset)>1:
        mid=int(len(dataset)/2)
        if dataset[mid]>num:
            return find_num(dataset[0:mid],num)
        elif dataset[mid]==num:
            print("找到数字%s"%num)
        else:
            return find_num(dataset[mid+1:],num)
    else:
        if dataset[0]==num:
            print("找到数字%s"% num)
​
        else:
            print("未找到数字%s"%num)
​
while True:
    search_data=input("请输入要查找的数字:")
    if search_data=='q':
        exit()
    else:
        search_data=int(search_data)
        find_num(data,search_data)
​
输出结果:
请输入要查找的数字:20
找到数字20
请输入要查找的数字:q
​
Process finished with exit code 0

员工信息表

要求:

  1. 可进行模糊查询,语法至少支持下面3种:

    1.   select name,age from staff_table where age > 22

    2.   select  * from staff_table where dept = "IT"

    3.       select  * from staff_table where enroll_date like "2013"

    4. 可修改员工信息,语法如下:

      1.   UPDATE staff_table SET dept="Market" WHERE where dept = "IT"

    员工信息:

    1,Alex Li,22,13651054608,IT,2013-04-01
    2,Jack Wang,30,13304320533,HR,2015-05-03
    3,Rain Liu,25,1383235322,Sales,2016-04-22
    4,Mack Cao,40,1356145343,HR,2009-03-01
f=open("inter","r+",encoding="utf-8")
l=[]
l1=["staff_id","name","age","phone","dapt","enroll_date"]
for line in f:
    line=line.strip().split(",")
    d={}
    for i in range(0,len(line)):
        d.setdefault(l1[i],line[i])
    l.append(d)
    if "IT" in line:
        line=line.replace("IT","Market")
def search(n):
    if n==1:
        for i in range(0,len(l)):
            if l[i]["age"]=="22":
                print("name=%s,age=%s"%(l[i]["name"],l[i]["age"]))
    elif n==2:
        for i in range(0,len(l)):
            if l[i]["dept"]=="IT":
                print(l[i])
    elif n==3:
        for i in range(0,len(l)):
            if l[i]["enroll_date"]in"2013":
                print(l[i])
​
f.close()
未完成!!!
原文地址:https://www.cnblogs.com/pythonbigdata/p/8459512.html