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

    Python基础学习05


    函数


    一、什么是函数

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

    特性:
    1.减少重复代码
    2.使程序变的可扩展
    3.使程序变得易维护

    语法定义:

    1 def test():        #test为函数名
    2     print("in the test..")
    3 test()        # 用test函数
    4 
    5 def test_1(x,y): #带参数的函数
    6     print(x)
    7     print(y)
    8 
    9 test_1(2,3)   #调用时必须传入参数(实参)
    View Code

     二、参数

    1、形参实参

    形参:形式参数,不是实际存在,是虚拟变量。在定义函数和函数体的时候用形参,目的是在函数调用时接收实参(实参个数,类型应与实参一一对应),形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

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

    区别:形参是虚拟的,不占用内存空间,形参变量只有在被调用时才分配内存单元,实参是一个变量,占用内存空间,数据传送单向,实参传给形参,不能形参传给实参 

    1 def test_1(x,y): #x,y为形参
    2     print(x)
    3     print(y)
    4 test_1(2,3)   #调2,3为实参
    View Code

    2、位置参数调用与关键字调用

     1 #位置参数和关键字(标准调用:实参和形参一一对应,关键字调用:位置无需固定)
     2 
     3 def test_1(x,y):
     4     print(x)
     5     print(y)
     6 test_1(2,3)   #这种调用为位置参数调用,形参和实参必须一一对应
     7 
     8 def test_1(x,y):
     9     print(x)
    10     print(y)
    11 test_1(y=3,x=2)   #这种调用为关键字调用,位置无需固定
    12 
    13 def test_1(x,y,z):
    14     print(x)
    15     print(y)
    16     print(z)
    17 test_1(2,z=4,y=3)   #既有位置参数调用,又有关键字调用时,位置调用参数必须写在关键字调用参数之前
    View Code

    3、默认参数,可变参数

     1 #默认参数
     2 def test_1(x,y=3):  #y为默认参数
     3     print(x)
     4     print(y)
     5 test_1(2)         #调用时可以不赋值,如果不赋值则y=3 结果为:2,3
     6 test_1(2,4)       #调用时如果赋值,则y=4(调用时赋的值) 结果为:2,4
     7 #默认参数特点:调用函数的时候,默认参数非必须传值
     8 
     9 #可变参数(参数组)
    10 def test_2(*args):     #可以接收多个值
    11     print(args)
    12 test_2(1,2,3,4,5,6)    #直接传递参数,结果以元组的形式输出:(1, 2, 3, 4, 5, 6)
    13 test_2(*[1,2,3,4,5,6])  #或者在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去,结果同上
    14 
    15 def test_3(x,*args):
    16     print(x,args)
    17 test_3(1,2,3,4,5,6)   #输出:1 (2, 3, 4, 5, 6)
    18 
    19 def test_2(**kwargs):     #可以接收多个关键字参数
    20     print(kwargs)
    21 test_2(name="zz",age="2")  #将关键字参数转换成字典的形式:{'age': '2', 'name': 'zz'}
    22 test_2(**{'age': '2', 'name': 'zz'})   #同上
    View Code

    三、其他特性

    1、作用域:局部与全局变量

    在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
    全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
    当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。

    1 name = "aaa"
    2 def change_name(name):
    3     print("before change:",name)       #aaa
    4     name = "zzz"
    5     print("after change", name)        #zzz
    6 change_name(name)
    7 print("在外面的name",name)             #aaa
    View Code

    2、返回值

    返回值的目的是要想获取函数的执行结果,函数在执行过程中只要遇到return语句,就会停止执行并返回结果,return 语句代表着函数的结束;如果未在函数中指定return,那这个函数的返回值为None 

    3、匿名函数

    匿名函数就是不需要显式的指定函数,只能处理比较简单的运算例如:三元运算,不能处理判断循环等复杂运算。匿名函数主要是和其它函数搭配使用

    1 #常规函数定义
    2 def calc(n):
    3     return n**n
    4 print(calc(10))
    5 
    6 #换成匿名函数
    7 calc = lambda n:n**n
    8 print(calc(10))
    View Code

     4、递归

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

    递归特性:
    1. 必须有一个明确的结束条件
    2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
    3. 递归效率不高,递归层次过多会导致栈溢出(递归上限999次)

     1 def num(n):
     2     print(n)
     3     if int(n/4) ==0:
     4         return n
     5     return num(int(n/4))
     6 num(20)
     7 '''输出:
     8 20
     9 5
    10 1
    11 '''
    View Code

    四、内置函数

      1 #abs() 返回数字的绝对值
      2 print(abs(-32))  #输出:32
      3 
      4 #all() 如果可迭代对象中所有元素都为真则返回真
      5 print(all([1,-1,2]))    #输出:True(非0即真)
      6 print(all([0,-1,2]))    #输出:False
      7 
      8 #any()  如果可迭代对象中任意元素为真则返回真
      9 print(any([0,-1,2]))    #输出:True
     10 print(any([]))           #输出:False
     11 
     12 #ascii() 把一个内存对象变成一个可打印的字符串
     13 print([ascii([1,-1,2])])   #输出:['[1, -1, 2]']
     14 
     15 #bin() 十进制数字转二进制
     16 print(bin(12))   #输出:0b1100
     17 
     18 #bool  判断真假
     19 print(bool("asd"))    #输出:True(非0即真)
     20 print(bool([]))       #输出:False
     21 
     22 #bytearray  可修改的二进制字节格式(没啥用)
     23 b = bytearray("abcd",encoding="utf-8")
     24 print(b[1])   #输出:98   (ascii码的值)
     25 b[1] = 99     #必须是ascii码的值
     26 print(b)      #输出:bytearray(b'accd')
     27 
     28 #bytes() 返回值为一个新的不可修改字节数组
     29 b = bytes("abcd",encoding="utf-8")
     30 print(b)        #输出:b'abcd'
     31 
     32 #callable()  判断是否可以调用
     33 print(callable([1,2]))   #输出:False 列表不可调用,函数可调用
     34 
     35 #chr()  返回数字对应的ascii码表中对应字母
     36 print(chr(100))      #输出:d
     37 
     38 #ord()   返回字母对应的ascii码表中的数字
     39 print(ord("d"))     #输出:100
     40 
     41 #classmethod()  #类方法,修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等
     42 class A(object):
     43     bar = 1
     44     def func1(self):
     45         print ('foo')
     46     @classmethod
     47     def func2(cls):
     48         print ('func2')
     49         print (cls.bar)
     50         cls().func1()   # 调用 foo 方法
     51 A.func2()               # 不需要实例化
     52 """输出:
     53 func2
     54 1
     55 foo
     56 """
     57 
     58 #compile() #底层的,用于把代码进行编译(用不到)
     59 
     60 #complex() 函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数
     61 print(complex(1, 2))    #输出:(1+2j)
     62 # 注意:这个地方在"+"号两边不能有空格,也就是不能写成"1 + 2j",应该是"1+2j",否则会报错
     63 print(complex("1+2j"))  #输出:(1+2j)
     64 
     65 #delattr() 函数用于删除属性(面向对象:delattr()、getattr()、hasattr()、setattr())
     66 class Coordinate:
     67     x = 10
     68     y = -5
     69     z = 0
     70 point1 = Coordinate()
     71 print('x = ',point1.x)
     72 print('y = ',point1.y)
     73 print('z = ',point1.z)
     74 delattr(Coordinate, 'z')
     75 print('--删除 z 属性后--')
     76 print('x = ',point1.x)
     77 print('y = ',point1.y)
     78 # 触发错误
     79 # print('z = ',point1.z)  #AttributeError: 'Coordinate' object has no attribute 'z'
     80 
     81 #dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。
     82 print(dir()) #输出:['A', 'Coordinate', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'b', 'point1']
     83 
     84 # divmod() 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)。
     85 print(divmod(7, 2))  #输出:(3, 1)
     86 
     87 #enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
     88 seasons = ['Spring', 'Summer', 'Fall', 'Winter']
     89 print(list(enumerate(seasons)))  #输出:[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
     90 print(list(enumerate(seasons, start=1)) )      # 下标从 1 开始[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
     91 for i, element in enumerate(seasons):
     92     print (i, seasons[i])
     93 '''0 Spring
     94 1 Summer
     95 2 Fall
     96 3 Winter
     97 '''
     98 
     99 #eval() 执行一个字符串表达式,并返回表达式的值。
    100 print(eval( '3 * 2' ))  #输出:6
    101 
    102 #exec()  执行一个文件
    103 # exec(hello.py)
    104 
    105 #filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
    106 #过滤出1~100中平方根是整数的数:
    107 import math
    108 def is_sqr(x):
    109     return math.sqrt(x) % 1 == 0
    110 newlist = filter(is_sqr, range(1, 101))
    111 for i in newlist:
    112     print(i)   #在py2中为列表,3中为迭代器需要循环打印
    113 
    114 filter(lambda n:n>5,range(10))  #也可以用匿名函数
    115 
    116 #float() 将整数和字符串转换成浮点数
    117 print(float("123"))  #输出:123.0
    118 print(float(123))
    119 
    120 #format()  格式化输出
    121 
    122 #frozenset() 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。
    123 print(frozenset(range(10))) #frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
    124 
    125 #getattr() 函数用于返回一个对象属性值。(面向对象)
    126 
    127 #globals() 以字典类型返回当前位置的全部全局变量。
    128 print(globals())
    129 
    130 #hasattr() 用于判断对象是否包含对应的属性。(面向对象)
    131 
    132 #hash() 用于获取取一个对象(字符串或者数值等)的哈希值。
    133 print(hash("asdf"))  #输出:5704709918237842944
    134 
    135 #help() 用于查看函数或模块用途的详细说明。
    136 help('sys')
    137 help('str')
    138 a = [1,2,3]
    139 help(a)
    140 help(a.append)
    141 
    142 #hex() 函数用于将10进制整数转换成16进制,以字符串形式表示
    143 print(hex(100))  #输出:0x64
    144 
    145 #id() 函数用于获取对象的内存地址。
    146 a = "a"
    147 print(id(a))  #输出:3231243404264
    148 
    149 #input() 函数接受一个标准输入数据,返回为 string 类型
    150 #int() 函数用于将一个字符串或数字转换为整型。
    151 #isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
    152 a = 2
    153 print(isinstance (a,int))      #  True
    154 print(isinstance (a,str))      #  False
    155 print(isinstance (a,(str,int,list)))    # 是元组中的一个返回 True
    156 
    157 '''isinstance() 与 type() 区别:
    158 type() 不会认为子类是一种父类类型,不考虑继承关系。
    159 isinstance() 会认为子类是一种父类类型,考虑继承关系。
    160 如果要判断两个类型是否相同推荐使用 isinstance()。
    161 '''
    162 class A:
    163     pass
    164 class B(A):
    165     pass
    166 print(isinstance(A(), A))    #  True
    167 print(type(A()) == A  )      #  True
    168 print(isinstance(B(), A) )   #  True
    169 print(type(B()) == A )       #  False
    170 
    171 #issubclass() 方法用于判断参数 class 是否是类型参数 classinfo 的子类。(面向对象)
    172 #iter() 用来生成迭代器
    173 lst = [1, 2, 3]
    174 for i in iter(lst):
    175     print(i)
    176 
    177 #len() 方法返回对象(字符、列表、元组等)长度或项目个数
    178 str = "runoob"
    179 print(len(str) )            # 字符串长度:6
    180 l = [1,2,3,4,5]
    181 print(len(l)  )             # 列表元素个数:5
    182 
    183 #locals() 函数会以字典类型返回当前位置的全部局部变量。(参考globals)
    184 print(locals())
    185 
    186 #map() 会根据提供的函数对指定序列做映射。
    187 #第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
    188 def square(x) :            # 计算平方数
    189     return x ** 2
    190 map(square, [1,2,3,4,5])   # 计算列表各个元素的平方:[1, 4, 9, 16, 25]
    191 map(lambda x: x ** 2, [1, 2, 3, 4, 5])  # 使用 lambda 匿名函数:[1, 4, 9, 16, 25]
    192 # 提供了两个列表,对相同位置的列表数据进行相加
    193 map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])  #[3, 7, 11, 15, 19]
    194 #py3中结果为迭代器需循环打印
    195 
    196 #max() 方法返回给定参数的最大值,参数可以为序列。
    197 print(max(1,3,4,2,0))   #输出:4
    198 #min() 方法返回给定参数的最小值,参数可以为序列。
    199 print(min(1,3,4,2,0))   #输出:0
    200 
    201 #memoryview() 函数返回给定参数的内存查看对象(Momory view)。所谓内存查看对象,是指对支持缓冲区协议的数据进行包装,在不需要复制对象基础上允许Python代码访问。
    202 #next() 返回迭代器的下一个项目。
    203 #object() 定义对象
    204 #oct() 函数将一个整数转换成8进制字符串。
    205 print(oct(100))   #输出:0o144
    206 
    207 #open() 文件操作
    208 #pow() 方法返回 xy(x的y次方) 的值
    209 print(pow(3,4))   #输出:81
    210 
    211 #print() 方法用于打印输出,最常见的一个函数。
    212 #property() 函数的作用是在新式类中返回属性值。(面向对象)
    213 #range() 函数可创建一个整数列表,一般用在 for 循环中
    214 #repr() 函数将对象转化为供解释器读取的形式
    215 #reverse() 函数用于反向列表中元素(列表操作中的一样)
    216 aList = [123, 'xyz', 'zara', 'abc', 'xyz']
    217 aList.reverse()
    218 print("List : ", aList) #输出:List :  ['xyz', 'abc', 'zara', 'xyz', 123]
    219 
    220 #round() 方法返回浮点数x的四舍五入值。
    221 print(round(1.234,2))  #输出:1.23
    222 
    223 #set() 函数创建一个无序不重复元素集(参考创建集合)
    224 #setattr 函数对应函数 getatt(),用于设置属性值,该属性必须存在。(面向对象)
    225 #slice() 函数实现切片对象,主要用在切片操作函数里的参数传递。
    226 #sorted() 函数对所有可迭代的对象进行排序操作。
    227 '''
    228 sort 与 sorted 区别:
    229 sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
    230 list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
    231 '''
    232 a = [5,7,6,3,4,1,2]
    233 b = sorted(a)       # 保留原列表
    234 print(a)            #[5, 7, 6, 3, 4, 1, 2]
    235 print(b)            #[1, 2, 3, 4, 5, 6, 7]
    236 
    237 L=[('b',2),('a',1),('c',3),('d',4)]
    238 print(sorted(L, key=lambda x:x[1]) )              #  [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
    239 
    240 students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
    241 sorted(students, key=lambda s: s[2])            # 按年龄排序[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
    242 sorted(students, key=lambda s: s[2], reverse=True)      # 按降序[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
    243 
    244 #staticmethod 返回函数的静态方法(面向对象)
    245 #str() 函数将对象转化为适于人阅读的形式
    246 #sum() 列表求和计算
    247 #super() 函数是用于调用父类(超类)的一个方法(面向对象)
    248 #tuple() 将列表转换为元组
    249 #type()  所有数据类型的根源
    250 #vars() 返回对象object的属性和属性值的字典对象
    251 #zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
    252 # 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
    253 a = [1,2,3]
    254 b = [4,5,6]
    255 c = [4,5,6,7,8]
    256 zipped = zip(a,b)     # 打包为元组的列表[(1, 4), (2, 5), (3, 6)]
    257 zip(a,c)              # 元素个数与最短的列表一致[(1, 4), (2, 5), (3, 6)]
    258 zip(*zipped)          # 与 zip 相反,可理解为解压,返回二维矩阵式[(1, 2, 3), (4, 5, 6)]
    259 #py3中为迭代器,需循环打印
    260 
    261 #__import__() 函数用于动态加载类和函数 。
    262 # 如果一个模块经常变化就可以使用 __import__() 来动态载入。
    View Code
  • 相关阅读:
    canvas设置渐变
    canvas设置线条样式
    canvas给图形添加颜色
    Vue中父组件与子组件之间传值
    Vue实例的生命周期
    es6常用语法和特性
    JS基础:常用API
    JS基础:函数
    JS基础:闭包和作用域链
    JS基础:this的指向以及apply、call的作用
  • 原文地址:https://www.cnblogs.com/hy0822/p/9058025.html
Copyright © 2011-2022 走看看