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

    Python3---函数基础,匿名函数,内置函数
    2018年04月15日 17:09:39 阅读数:69更多
    个人分类: Python
    一.函数.
    函数就是对代码进行一个封装。把实现,某一功能的相同代码,进行封装到一起。下次需要使用时,就不需要再进行代码编写,直接调用即可。

    好处:函数能提高应用的模块性,和代码的重复利用率。

    二.函数的定义
    (1)函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
    (2)任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
    (3)函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
    (4)函数内容以冒号起始,并且缩进。
    (5)return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

    定义方法:

    def function_name(params):
    block
    return expression(表达式)/value
    def 关键字表示定义一个函数
    function_name 函数名,和变量名的命名要求相同,以字母和_开头,可以包含字母、数字和_
    params 表示参数,可以是零个,一个 或者多个参数,函数参数不用指定参数类型

    三.函数的调用
    函数名+()

    # 定义函数
    def printme( str ):
    "打印任何传入的字符串"
    print (str);
    return;

    # 调用函数
    printme("我要调用用户自定义函数!");
    printme("再次调用同一函数");
    运行结果:

    我要调用用户自定义函数!
    再次调用同一函数
    四.参数形式
    (1)不传参
    #不传参
    def fun1():
    print('不能传参数')
    (2)必备参数
    #必备参数
    def fun2(a):
    print('必须传参数',a)
    (3)默认参数
    #默认参数
    def fun3(b=2):
    print('默认参数',b) #可传可不传
    (4)可选参数(*args)
    #可选参数
    def fun4(*args):
    print('可传0到多个',args )#可传0到多个 包装成元组
    >>> fun4() #不传参
    可传0到多个 ()
    >>> fun4(1) #传递一个参数
    可传0到多个 (1,)
    >>> fun4(1,2,3,4) #传递多个参数
    可传0到多个 (1, 2, 3, 4)
    >>> fun4([1,2,3]) #传递一个列表
    可传0到多个 ([1, 2, 3],)
    >>> fun4({'j':1}) #传递一个字典
    可传0到多个 ({'j': 1},)
    >>> fun4((1,2,3,4)) #传递一个元组
    可传0到多个 ((1, 2, 3, 4),)
    解包(参数前加 *):去掉里面的壳,比如{},[],()
    >>> fun4(*[1,2])
    可传0到多个 (1, 2)
    >>> fun4(*{'a':1})
    可传0到多个 ('a',)
    (5)关键字参数(**kwargs)
    def fun5(**kwargs):
    print('关键字参数',kwargs) #包装成字典,可传0个到多个
    >>> fun5(a=1,b=2) #遵循变量命名规则
    关键字参数 {'a': 1, 'b': 2}

    >>> fun5(**{'a':1})
    关键字参数 {'a': 1} 键必须是字符串
    可选参数和关键字参数统称为不定长参数
    定义方法: def function_name(*args,**kwargs):
    *args 将传入参数包装成元组
    **kwargs将传入参数包装成字典
    (6)参数混合时:
    参数混合时:关键字参数必须放到最后 根据定义的顺序,确保必备参数能拿到值,且只能拿到一个值

    #必备参数+默认参数:默认参数必须在必备参数的后面
    def fun6(a,b=1):
    print(a,b)
    >>> fun6(1,b=2)
    1 2
    #例2
    def fun8(b,m=1,*args):
    print(b)
    print(m)
    print(args)
    >>> fun8(1,3,2,3,4)
    1
    3
    (2, 3, 4)
    五.return和lambda匿名函数

    return有两个作用:

    1.用来返回函数的运行结果,或者调用另外一个函数。比如max()函数

    >>> def fun1(a,b):
    if a>b:
    return a
    >>> a=fun1(2,1)
    >>> a
    2
    [python] view plain copy
    <code class="language-python">#不加return时
    >>> def fun1(a,b):
    if a>b:
    print(a)
    >>> b = fun1(2,1)
    2
    >>> b
    >>> #由此可见,不加return时返回的是None</code>
    2.函数结束的标志。只要运行了return,就强制结束了函数。return后面的程序都不会被执行。

    如果函数中没有写return,其实函数运行结束时,默认执行了 return None
    return语句的位置是可选的,不是固定出现再函数的最后,可以自定义在函数中的任何地方。

    def fun(a,b):
    #return 'return可以放在任何位置~' #函数结束的标志,可以放在任何地方
    if a > b :
    print(a)
    return 'return可以放在任何位置~'
    print(fun(10,2))

    #运行结果
    10
    return可以放在任何位置~
    lambda匿名函数:

    没有函数名的函数
    g = lambda x:x+1

    lambda简化了函数定义的书写形式。是代码更为简洁,但是使用函数的定义方式更为直观,易理解

    def fun(a):
    return(a+1)
    g相当于fun这个函数体,lambda相当于fun(),x 相当于fun函数里的参数a,冒号后面的x+1相当于return后面的a+1
    lambda的应用场景:

    1.有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要用def 来定义,这个时候就可以用lambda。
    2.函数都支持函数作为参数,lambda 函数就可以应用

    六.内置函数
    (1)常见的简单内置函数
    内置对象查看:dir(__builtins__)

    常见函数


    len 求长度
    min 求最小值
    max 求最大值
    sorted 排序
    reversed 反向
    sum 求和
    进制转换函数:


    bin 转换为二进制
    oct 转换为八进制
    hex 转换为十六进制
    ord 字符转ASCII码
    chr ASCII码转字符
    (2)高级内置函数
    1.enumerate 返回一个可以枚举的对象

    enumerate([1,2,3]) #<enumerate object at 0x00000000033A4F78>
    list(enumerate([1,2,3]))#返回一个枚举对象(索引,值)索引可以自定义 [(0, 1), (1, 2), (2, 3)]
    dict(enumerate(['a','b','c'],2))#{2: 'a', 3: 'b', 4: 'c'}
    2.eval
    取出字符串中的内容
    将字符串str当成有效的表达式来求值并返回计算结果
    详情请参考:

    http://lib.csdn.net/mobile/article/python/62300
    http://www.runoob.com/python/python-func-eval.html

    3.exec 执行字符串或complie方法编译过的字符串

    http://www.runoob.com/python3/python3-func-exec.html

    4.filter 过滤器

    filter(None,[1,2,3])#<filter object at 0x000001E052827FD0>
    list(filter(lambda x:x>1,[1,2,3]))
    '''
    给定一个过滤的函数当参数,过滤可迭代对象
    '''
    5.map 对于参数iterable中的每个元素都应用fuction函数,并将结果作为列表返回(加工)

    list(map(lambda x:x+1,[1,2,3,4]))#[2, 3, 4, 5]
    list(map(str,[1,2,3,4]))#['1', '2', '3', '4']
    6.zip 将对象逐一配对

    list(zip([1,2,3])) #[(1,), (2,), (3,)]
    list(zip([1,2,3],['a','b','c']))#[(1, 'a'), (2, 'b'), (3, 'c')]
    list(zip([1,2,3],['a','b','c'],(11,22,33)))
    练习1:

    找到1-100以内的质数,用while和for来做,找完后打印出“搜索结束”

    #for
    li = []
    for i in range(1,101):
    for j in range(2,i):
    if i%j==0:
    break
    else:
    li.append(i)
    else:
    print(li)
    print('搜索结束')
    #while
    li = []
    j=2
    while j<101:
    for i in range(2,j):
    if j%i==0:
    break
    else:
    li.append(j)
    j+=1
    else:
    print(li)
    print('搜索结束')
    练习2:

    定义一个函数,能够输入字典和元组,将字典的值和元组的值交换

    tu = (1,2,3)
    di = {'a':11,'b':22,'c':33}
    def exchange(*args,**kwargs):
    args = list(args)
    i = 0
    for key in kwargs.keys():
    args[i],kwargs[key] = kwargs[key],args[i]
    i+=1

    print(kwargs)
    print(tuple(args))

    exchange(*tu,**di)
    #运行结果
    {'a': 1, 'b': 2, 'c': 3}
    (11, 22, 33)
    (2)利用zip函数

    tu = (1,2,3)
    di = {'a':11,'b':22,'c':33}
    def exchange(a,b):
    c = a.values()
    return dict(zip(a,b)),tuple(c)

    print(exchange(di,tu))
    #运行结果
    ({'a': 1, 'b': 2, 'c': 3}, (11, 22, 33))
    练习3:

    定义一个函数,必须包含四种参数形式,然后打印这四个参数,最后返回“OK”

    def fun(b,m=1,*arg,**kwarg):
    print('必备参数',b)
    print('默认参数',m)
    print('不定长参数',arg)
    print('关键字参数',kwarg)
    return 'ok'
    >>> fun(1,2,1,2,3,x=1,y=2,z=3)
    必备参数 1
    默认参数 2
    不定长参数 (1, 2, 3)
    关键字参数 {'x': 1, 'y': 2, 'z': 3}
    'ok'

  • 相关阅读:
    Java乔晓松oracle的多表查询
    定义一个地址固定的变量
    J2ME的表单元素及其事件
    J2me的异常处理和多线程
    [置顶] eclipse远程部署,静态文件实时同步插件
    newlisp debugger
    启用isqlplus
    ORA27101: shared memory realm does not exist
    windows下安装node.js及less
    em启动/关闭报错解决
  • 原文地址:https://www.cnblogs.com/michaelwang2018/p/9635614.html
Copyright © 2011-2022 走看看