zoukankan      html  css  js  c++  java
  • python—函数

    函数

    1. python中函数定义方法:

     1 def  test(x):
     2         '''注释,解释函数用途'''
     3         x=x+1
     4         return x
     5 
     6 def:定义函数的关键字
     7 test:函数名
     8 ():括号内可定义形参
     9 x=x+1:泛指代码块或者程序处理逻辑
    10 return:定义返回值

    过程:过程就是简单特殊没有返回值的函数(没有返回值返回none)

    2. 函数参数:

     1 1.形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元,因此,形参只有在函数内部才有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
     2 2.实参变量可以是常量,变量,表达式,函数等,无论函数是何种类型的量,在进行函数调用时,它们必须有确定的值,以便把这些值传递给形参。因此应用预先赋值,输入等办法使参数获得确定值。
     3 def  calc(x,y):
     4         res=x**y
     5         return res
     6 a=calc(2,3)
     7 print(a)
     8 #运行结果:8
     9 
    10 位置变量:(位置参数,一 一对应,缺一不可)
    11 def  test(x,y,z):
    12         print(x)
    13         print(y)
    14         print(z)
    15 test(1,2,3)
    16 
    17 def  test(x,y,z):   (关键字参数,无须一一对应,缺一不行多一不行)
    18         print(x)
    19         print(y)
    20         print(z)
    21 test(x=1,z=3,y=2)

      3.全局变量与局部变量

    1 name="zhouyuan"      #全局变量,全局作用域
    2 def  change_name():
    3     name="zhoutao"    #局部变量,局部作用域
    4     print(name)
    5 change_name()
    6 print(name)
    7 #运行结果:zhoutao
    8 #       zhouyuan

        #如果想要在局部作用域内定义全局变量,使用关键字global

     1 name="zy"
     2 def a():
     3     global name
     4     print(name)
     5 def b():
     6     name="zt"
     7     print(name)
     8 a()
     9 b()
    10 # 运行结果:zy
    11 #         zt

       #如果函数的内容无global关键字,优先读取局部变量。对于全局变量只能读取,不能重新赋值

       #如果函数中有global关键字变量本质上就是全局的那个变量,可读取可赋值

     1 name="zy"
     2 def a():
     3     global name
     4     name="zz"        #现在zz是全局的
     5     print(name)
     6 def b():
     7     print(name)
     8 a()       
     9 b()
    10 #运行结果:zz
    11 #          zz        (因为a()先执行,a()已经将全局变量变成name=“zz”)
    12 
    13 name="zy"
    14 def a():
    15     global name
    16     name="zz"        #现在zz是全局的
    17     print(name)
    18 def b():
    19     print(name)     
    20 b()         (先执行b()未执行到global)
    21 a()
    22 #运行结果:zy
    23 #        zz

      #全局变量还可以是列表等类型,并且可以在函数内部对列表进行操作

    1 name=["蔡徐坤","朱正廷"]
    2 def zy():
    3     name.append("范丞丞")
    4     print(name)
    5 zy()
    6 #运行结果:['蔡徐坤', '朱正廷', '范丞丞']

     #函数内套函数

     1 name="蔡徐坤"
     2 
     3 def zy():
     4     name="范丞丞"
     5     def zt():
     6         global name
     7         name="农农"
     8     zt()
     9     print(name)
    10 
    11 print(name)
    12 zy()
    13 print(name)
    14 
    15 #运行结果:蔡徐坤
    16 #        范丞丞
    17 #        农农

      #nonlocal关键字修改上一层变量

     1 name="蔡徐坤"
     2 
     3 def zy():
     4     name="范丞丞"
     5     def zt():
     6         nonlocal name
     7         name="农农"
     8     zt()
     9     print(name)
    10 
    11 print(name)
    12 zy()
    13 print(name)
    14 
    15  #运行结果:蔡徐坤
    16 #         农农
    17 #         蔡徐坤 

      4.函数递归

    递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身,就是递归调用
    递归特性:
    1.必须有一个明确的结束条件
    2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
    3.递归效率不高,递归层次过多会导致栈溢出
    
    1 def calc(n):
    2     print(n)
    3     if int(n/2)==0:
    4         return n
    5     return calc(int(n/2))
    6 calc(10)
    7 #运行结果:10,5,2,1

     5.函数作用域

     1 def test1():
     2     print("in the test1")
     3 def test():
     4     print("in the test")
     5     return test1
     6 res=test()
     7 print(res())
     8 #运行结果:in the test
     9 #        in the test1
    10 #        None    (test1没有返回值默认返回None)

      

      6.匿名函数 lambda

     1 def calc(x):
     2     return x+1
     3 
     4 res=calc(10)
     5 print(res)
     6 #运行结果:11
     7 
     8 使用lambda匿名函数:
     9 res=lambda x:x+1    【lambda匿名函数后面x是形参,x+1相当于return x+1】
    10 print(res(1))
    11 #运行结果:2

      #修改字符串

    1 name="zy"
    2 f=lambda x:x+"_sb"
    3 res=f(name)
    4 print(res)
    5 #运行结果:zy_sb

     

     7.三个重要函数 map() filter() reduce()

       【1】map函数 (处理列表中的每个元素,得到结果是一个‘列表’,该‘列表’元素个数及位置与原来一样)

     1 #map(处理方法,可迭代对象)
     2 num_1=[1,2,3,4,5,6]
     3 
     4 def map_test(func,array):
     5     ret=[]
     6     for i in array:
     7         res=func(i)
     8         ret.append(res)
     9     return ret
    10 
    11 print(map_test(lambda x:x+1,num_1))
    12 
    13 res=map(lambda x:x+1,num_1)
    14 print(list(res))
    15 
    16 #运行结果:[2, 3, 4, 5, 6, 7]
    17 #        [2, 3, 4, 5, 6, 7]

       【2】filter 函数  (遍历序列中每个元素,判断每个元素,得到布尔值,如果是True则留下来)

     1 movie_people=['sb_alex','sb_zt','zy','sb_wu']
     2 
     3 def filter_test(array):
     4     ret=[]
     5     for i in array:
     6         if not i.startswith('sb'):
     7             ret.append(i)
     8     return ret
     9 
    10 print(filter_test(movie_people))
    11 #运行结果:['zy']
    12 
    13 #终极版本
    14 movie_people=['alex_sb','zt_sb','zy','wu_sb']
    15 
    16 def filter_test(func,array):
    17     ret=[]
    18     for i in array:
    19         if not func(i):
    20             ret.append(i)
    21     return ret
    22 
    23 res=filter_test(lambda n:n.endswith('sb'),movie_people)
    24 print(res)

     #使用filter()函数

    1 movie_people=['alex_sb','zt_sb','zy','wu_sb']
    2 
    3 res=list(filter(lambda n:not n.endswith('sb'),movie_people))
    4 print(res)
    5 #运行结果:['zy']
    6 
    7 filter()函数后面是可迭代对象,进行for循环,每个元素进行前面的操作,满足操作输出,没有list输出内存地址。list()就是将其转换成列表输出。

      【3】reduce 函数

     1 #计算列表元素之积
     2 num_1=[1,2,3,100]
     3 
     4 def reduce_test(func,array):
     5     res=1
     6     for num in array:
     7         res=func(res,num)
     8     return res
     9 
    10 print(reduce_test(lambda x,y:x*y,num_1))
    11 #运行结果:600
    12 
    13 #reduce函数(将一个列表进行函数计算最终得一个结果)
    14 from functools import reduce     #使用reduce函数python3中必须导入这个模块
    15 num_1=[1,2,3,100]
    16 print(reduce(lambda x,y:x+y,num_1,0))  
    17 #reduce第一个参数是函数,第二个参数是被执行的列表,第三个参数是初始值
    18 #运行结果:106

     8.内置函数

      1 #python中常用的内置函数
      2 【1】abs()   取绝对值
      3  print(abs(-1))
      4 #结果:1
      5 
      6 【2】all()  判断True False 只要有一个为False就为False  #0,空,None是False,其它为True
      7  print(all([1,2,'3']))
      8  print(all([1,2,'3','']))
      9 #结果:True False
     10 
     11  【3】any() 有一个为真就是True
     12  print(any([0,'']))
     13  print(any([0,'',1]))
     14 #结果:False True
     15 
     16  【4】bin() 十进制转换为二进制
     17  print(bin(3))
     18 #结果:0b11
     19 
     20  【5】bool()   布尔值  #0,空,None是False,其它为True
     21  print(bool(''))
     22  print(bool(None))
     23  print(bool(0))
     24 #结果:False False False
     25 
     26  【6】bytes()  字节编码
     27  name='你好'
     28  print(bytes(name,encoding='utf-8'))
     29 #结果:b'xe4xbdxa0xe5xa5xbd'
     30  print(bytes(name,encoding='utf-8').decode('utf-8'))
     31 #结果:你好
     32 #用什么编码就用什么解码, decode()解码,次例是utf-8编码,所以是utf-8解码
     33 #gbk,utf-8都可以解码,对于ascii码不能编码中文。
     34  
     35  【7】chr()  数字对应的ascii值
     36  print(chr(97))
     37 #结果:a
     38 
     39  【8】dir() 打印方法里的属性
     40  print(dir(dict))
     41 #结果:['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
     42 
     43  【9】divmod()  两数相除返回得数与余数
     44  print(divmod(10,3))
     45 #结果:(3,1)
     46 
     47  【10】eval()  计算字符串中表达式的结果;
     48  express='1+2*(5*1)'
     49  print(eval(express)) 
     50 #结果:11
     51 
     52  【11】hash() #可hash数据类型就是不可变数据类型;不可根据hash值来反推原值
     53  print(hash('1525'))    
     54 #结果:6370411092133961450
     55 #所有字符串或者值对于hash值是一样的,所以对于某个软件字符串hash是一样的,可用来判断软件是否被篡改。
     56 
     57  【12】help()  查看方法如何使用
     58 print(help(all))
     59 
     60  【13】hex()  十进制转化为十六进制
     61  print(hex(12))
     62 #结果:0xc
     63 
     64  【14】oct()  十进制转化为八进制
     65  print(oct(12))
     66 #结果:0o14
     67 
     68  【15】isinstance()  判断数据类型,返回True False
     69  print(isinstance(1,int))
     70 #结果:True
     71 
     72  【16】max()  min() 取最大最小
     73 
     74  【17】ord()  显示字符对应的数字
     75   print(ord(a))
     76 #结果:97
     77 
     78  【18】pow()  次方
     79  print(pow(2,4))   #2**4
     80  print(pow(2,4,3))   #(2**4)%3
     81 #结果:16 1
     82 
     83  【19】reversed()  反转
     84  li=[1,2,3,4]
     85  print(list(reversed(li)))
     86 #结果:[4,3,2,1]
     87 
     88  【20】round()   四舍五入
     89  print(round(3.5))
     90 #结果:4
     91 
     92  【21】slice()  切片操作
     93  li='hello'
     94  s1=slice(3,5)
     95  s2=slice(1,4,2)
     96  print(li[s1])
     97  print(li[s2])
     98 #结果:lo el
     99 
    100  【22】sorted()  排序
    101  li=[5,1,8,3]
    102  print(sorted(li))
    103 #结果:[1,3,5,8]
    104  li=[{'age':18},{'age':22},{'age':20}]
    105  print(sorted(li,key=lambda dic:dic['age']))
    106 #结果:[{'age': 18}, {'age': 20}, {'age': 22}]
    107 
    108  【23】zip()  取key和values的组合值
    109   people={'蔡徐坤age':18,
    110                 '农农age':19,
    111                 '范丞丞age':20}
    112   print(sorted(zip(people.values(),people.keys())))
    113 #结果:[(18, '蔡徐坤age'), (19, '农农age'), (20, '范丞丞age')]
    114 
    115  【24】str() 任意类型转化成字符串
    116 
    117  【25】sum()  求和
    118 
    119  【26】type() 判断数据类型

     9.zip方法

     1 zip方法
     2 print(list(zip(('a','b','c'),(1,2,3))))
     3 #结果:[('a', 1), ('b', 2), ('c', 3)]  (类似拉链,左右对应)
     4 
     5 p={'name':'alex','age':'18'}
     6 print(list(zip(p.keys(),p.values())))
     7 print(list(p.keys()))
     8 print(list(p.values()))
     9 #结果:[('age', '18'), ('name', 'alex')]
    10 #     ['age', 'name']
    11 #     ['18', 'alex']

    10.maxmin的高级用法

     1  #【只要是可迭代对象都可以用max与min,原理就是for循环】
     2 li=[1,3,51,6]
     3 print(max(li))
     4 print(min(li))
     5 #结果:51  1
     6 
     7 age_dic={'age1':18,'age2':20,'age3':100}
     8 print(max(age_dic.values()))
     9 print(max(age_dic))      #默认是取key的值
    10 #结果:100  age3    
    11 
    12 li=[(5,'a'),(1,'b'),(3,'e'),(4,'d')]
    13 print(list(max(li)))
    14 #结果:[5, 'a']
    15 
    16 li=['a10','b12','c10']      #不同类型之间不能进行比较['a10','b12','c10',100]不行  
    17 print(list(max(li)))
    18 #结果:['c', '1', '0']
    19 
    20 终极:
    21 people=[{'name':'alex','age':100},
    22             {'name':'zy','age':18},
    23             {'name':'zt','age':12}]
    24 print(max(people,key=lambda dic:dic['age']))
    25 #结果:{'name': 'alex', 'age': 100}
  • 相关阅读:
    2017-3-28 javaScript DOM 操作
    2017-3-28 JavaScript 基础、语法
    2017-3-25 CSS 样式表(二)
    js判断文件是否存在的方法
    关于eclipse添加自动查找文件以及svn的插件
    关于jqgrid的一些使用
    ztree框架使用问题汇总
    bootstrap框架的使用
    UIButton 设置阴影效果
    xcode升级至9.0之后,新建xib报错: Safe Area Layout Guide Before IOS 9.0
  • 原文地址:https://www.cnblogs.com/zhouyuan666/p/9459574.html
Copyright © 2011-2022 走看看