zoukankan      html  css  js  c++  java
  • python基础-函数

    1.函数基本语法和特性

      函数是指将一组语句的集合通过一个名字(函数名)封装起来,要执行函数,只要调用函数名。

      特性:

        1)减少重复代码

        2)使程序变的可扩展

        3)使程序变得易维护

    # -*- coding:utf-8 -*-
    __author__ = 'shisanjun'
    
    def sayhi(): #函数名
        print("hello,im nobody")
    
    sayhi() #调用函数
    
    def calc(x,y): #可以带参数,形参
        res=x*y
        return res
    
    print(calc(2,3))#实参
    

      2. 函数参数与局部变量

      形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。

      因此形参只在函数内部有效。函数调用结束返回主调用函数后则不能使用该形参变量。

      实参可以是常量,变量,表达式,函数等,无论实参是何种类型的量,在进行函数调用时它们

      都必须有确定的值,以便把这些值传给形参。所以应预先赋值,

      输入等办法使参数获得确定的值。

      3. 默认参数

        参数在不指定时,就用默认值。

        

    def calc(x,y=4): #可以带参数,y有默认值
        res=x*y
        return res
    
    print(calc(2))
    

      

      4. 关键参数

       正常情况下,给函数传参数是要按顺序,不想按顺序可以关键参数,只需要指定参

         数名即可。关键参数必须放在位置参数之后

      5. 非固定参数

        在不确定用户想传入多少个参数,就可以使用非固定参数

        *args 把多个传入的位置参数变成一个元组

        **kwargs把多个传入的关键参数变成一个字典

        

    
    
    def stu_register(name,age,*args): #*args 会把多传入的参数变成一个元组
    print(name,age,args)
    stu_register("Alex",22) #后面这个()就是args,只是没有传值,所以为空
    stu_register("Jack",32,"cn","python")

    def stu_register1(name,age,*args,**kwargs): #**kwargs 会把多传入的关键参数变成字典
    print(name,age,args,kwargs)

    stu_register1("Alex",22)
    stu_register1("Jack",32,"CN","Python",sex="male")
    
    

      6. 局部变量与全局变量

        在子程序中定义的变量为局部变量,在程序的一开始定义的变量称为全局变量。

        在全局变量作用或是整个程序,局部变量作用或是定义该变量的子程序

        当全局变量与局部变量同名时;子程序内局部变量起作用,在其他地方全局变量起作用。

        修改全局变量使用global;如果变量为列表,字典等,在局部变量可以修改

        

    # -*- coding:utf-8 -*-
    __author__ = 'shisanjun'
    
    name="alex"  #全局变量
    
    def change_name(name):
        print("befoce change",name)
        name="shisan" #局部变量
        print("after change",name)
    
    print(name)
    change_name(name)
    print(name)
    
    def change_name(name):
        print("befoce change",name)
        global name1 #修改全局变量,不建议使用
        name1="shisan" #局部变量
        print("after change",name)
    name1="alex"
    print(name1)
    change_name(name1)
    print(name1)
    

      7. 返回值 

        要想获得函数执行的结果,就可以用return语句把结果返回

        注:1)函数在执行过程中只要遇到return语句,就会停止执行并返回结果。

          2)如果未在函数中指定return,这个函数的返回值为None

      8. 函数可以嵌套函数。

      9. 递归

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

      递归特性:

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

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

        3)递归效率不高,递归层次过多会导致栈溢出。

        注:递归最大999次

      10. 匿名函数

        匿名函数就是不需要显式的指定函数。

      

    # -*- coding:utf-8 -*-
    __author__ = 'shisanjun'
    
    def calc(n):
        print(n)
        if int(n/2)==0:
            return n
        return calc(int(n/2))
    
    calc(10)
    
    def calc1(n):
        return n**n
    print(calc1(10))
    
    calc2=lambda n:n**n #换成匿名函数
    print(calc2(10))
    

      11.函数式编程

    python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。

      简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。主要思想是把运算过程尽量写成一系列嵌套的函数调用

      12. 高阶函数

        变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数

      13. 内置函数

      

    # -*- coding:utf-8 -*-
    __author__ = 'shisanjun'
    #https://docs.python.org/3/library/functions.html?highlight=built#ascii
    #返回一个数的绝对值。参数可能是整数或浮点数。如果参数是一个复数,返回它的大小
    print(abs(9))
    print((abs(-9)))
    print(abs(9.11))
    
    #返回 True如果所有的元素iterable真(或者如果iterable为空,即有0就为False
    print(all([1,2,3]))
    print(all((x for x in range(3)))) #False
    print(all([x for x in range(1,3)]))#TRUE
    
    #返回 True如果任何元素的iterable是正确的。如果iterable为空,返回 False
    print(any([1,2,3]))
    print(any((x for x in range(3))))
    print(any([x for x in range(3)]))
    
    #返回个字符串
    print(ascii('abcdef'))
    
    #将一个整数转换成一个二进制字符串
    print(bin(100))
    
    #返回一个布尔值,即之一 True或 False
    print(bool(1))
    print(bool(0))
    
    """
    bytearray() 这个个可变的序列
    返回一个新字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < 256。
    可以通过“字节与字节数组操作”章节来查看相关字节数组的内容。下面说明一下几种特别的使用方法:
    1. 如果source是一个字符串,那么必须给出endcoding是什么样编码的,以便转换为合适的字节保存。
    2. 如果source是一个整数,那么这个数组将初始化为空字节。
    3. 如果source是一个有缓冲区接口的对象,那么只读的接口初始到数组里。
    4. 如果source是一个迭代对象,那么这个迭代对象的元素都必须符合0 <= x < 256,以便可以初始化到数组里。
    """
    print(bytearray("aaaa中国333",encoding="utf-8")) #bytearray(b'aaaaxe4xb8xadxe5x9bxbd333')
    print(bytearray(10)) #bytearray(b'x00x00x00x00x00x00x00x00x00x00')
    print(bytearray([1,2,3])) #bytearray(b'x01x02x03')
    
    #返回一个新的“bytes”对象,这是一个不可变的整数序列
    
    print(bytes("aa",encoding="utf-8")) #b'aa'
    
    #是否可调用
    #callable()
    
    #返回表示Unicode代码点为整数i的字符的字符串
    print(chr(97))
    """
    compile(source, filename, mode[, flags[, dont_inherit]])
    中文说明:将source编译为代码或者AST对象。代码对象能够通过exec语句来执行或者eval()进行求值。
    参数source:字符串或者AST(Abstract Syntax Trees)对象。
    参数 filename:代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。
    参数model:指定编译代码的种类。可以指定为 ‘exec’,’eval’,’single’。
    参数flag和dont_inherit:这两个参数暂不介绍,可选参数。
    """
    code="for i in range(10):print(i)"
    cmpcode=compile(code,'','exec')
    exec(cmpcode)
    
    str="3*4+5"
    a = compile(str,'','eval')
    eval(a)
    
    #创建一个新的字典
    d=dict() #d={}
    
    #dir() #返回该对象的有效属性列表
    #divmod(5,2)#回一个由他们的商和余数组成的数字
    #enumerate([1,2,3])#返回枚举对象
    #eval()#将字符串str当成有效的表达式来求值并返回计算结果。
    #exec()#exec语句用来执行储存在字符串或文件中的Python语句
    """
    filter(function, sequence):对sequence中的item依次执行function(item),
    将执行结果为True的item组成一个List/String/Tuple
    取决于sequence的类型)返回
    """
    def f(x):return x%2 !=0 and x%3!=0
    for i in filter(f,range(2,25)):
        print(i)
    """
    map(function, sequence) :
    对sequence中的item依次执行function(item),
    见执行结果组成一个List返回
    """
    def f(x):return x*x
    for i in map(f,range(2,25)):
        print(i)
    """
    format(value [,format_spec ] )
    将值转换为由format_spec控制的“格式化”
    """
    
    print(hash("aaaa")) #返回对象的哈希值
    hex()#将整数转换为以“0x”为前缀的小写十六进制字符串
    oct()#将整数转换为八进制字符串
    input()#如果提示参数存在,则将其写入标准输出,而不带尾随的换行符。该函数然后从输入读取一行,将其转换为字符串(剥离尾随的换行符),并返回
    int()#转换成整数
    isinstance() #是不是实例
    issubclass()#是不是子类
    iter()#转成生成器
    locals()#反回局部变量
    len()#返回长度
    max()#反回最大值
    min()#返回最小值
    ord('c')#给定一个表示一个Unicode字符的字符串,返回一个整数
    pow(x,y)#将x返回到幂y
    #range(开始,停止[,步骤] )
    #repr(对象)返回一个包含对象的可打印表示的字符串
    #reversed(seq )返回一个反向迭代器
    #round(number [,ndigits ] )在小数点后,返回数字四舍五入到ndigits精度
    #sorted(iterable [,key] [,reverse] )从iterable中的项中返回一个新的排序列表
    #sum()求和
    #type(名称,基地,字典)使用一个参数,返回一个对象的类型
    #zip(* iterables )做一个迭代器来聚合每个迭代的元素。
  • 相关阅读:
    document.body.appendChild 的问题
    页面不刷新,表单提交到弹出窗口或Iframe
    您对无法重新创建的表进行了更改或者启用了 阻止保存要求创建表的更改
    转载:兼容各类浏览器的CSS Hack技巧
    sql server 代理权限问题
    配置SQL用户访问指定表,指定列
    关于嵌入式系统的启动(装载)
    centos 中安装g++
    嵌入式中利用ftp实现宿主机与目标机通信
    TQ2440加载Hello world驱动模块
  • 原文地址:https://www.cnblogs.com/lixiang1013/p/6742137.html
Copyright © 2011-2022 走看看