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

    1. python函数

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

    函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。

    2. 定义一个函数

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

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

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

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

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

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

    调用函数

    函数名加()

    实例1:函数不加()打印出来的是内存地址

    def a():

    print(1)

    print(a)

    <function a at 0x02F4B618>

    实例2:

    def test(name,age):

    print('名字:',name)

    print('年龄:',age)

    return

    test('lzb',18)

    名字: lzb

    年龄: 18

    3. 实参和形参

    定义函数括号里的一般叫形参

    调用时括号里传递的参数一般叫实参

    实例:

    def student(age):

    print('my age is %s' % age)

    student(18)

    age是型参,18是实参

    4. 参数的具体应用

    4.1 位置参数:按照从左到右的顺序定义的参数

    位置形参:必选参数

    位置实参:按照位置给形参传值

    实例:

    def a(x,y):

    print(x,y)

    a(1,2)

    1 2

    4.2 关键字参数:按照key=value的形式定义的实参,无需按照位置为形参传值。

    注意的问题:1. 关键字实参必须在位置实参右面 2. 对同一个形参不能重复传值

    实例:

    def a(x,y):

    print(x,y)

    a(y=2,x=1)

    1 2

    4.3 默认参数:形参在定义时就已经为其赋值,可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参)。

    注意的问题:

    1. 只在定义时赋值一次

    2. 默认参数的定义应该在位置形参右面

    3. 默认参数通常应该定义成不可变类型

    实例:

    def a(x,y=2):

    print(x,y)

    a(4)

    4 2

    def a(x,y=2):

    print(x,y)

    a(4,5)

    4 5

    4.4 可变长参数:可变长指的是实参值的个数不固定,而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*argsh和**kwargs

    *args:传递的参数会变成元组

    实例:

    def a(x,y,*args):

    print(x,y,args)

    a(1,2,3,4,5)

    1 2 (3, 4, 5)

    **kwargs:传递的参数会变成字典

    实例:

    def a(x,y,**kwargs):

    print(x,y,kwargs)

    a(1,2,a=4,b=4,c=4)

    1 2 {'a': 4, 'b': 4, 'c': 4}

    5. return语句,可以返回任意数据类型

    return语句[表达式]退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。

    6. 函数的特性

    6.1 函数可以被引用

    def f1():

    print('this is f1')

    return 'ok'

    res = f1()

    print(res)

    6.2 函数可以当参数传递

    def s1(a):

    print(a)

    def s2(b):

    print(b)

    s2(s1('测试'))

    测试

    None

    6.3 嵌套函数

    7. 名称空间和作用域

    内置名称空间:(python启动时就有)python解释器内置的名字,比如print,max,min

    全局名称空间:(执行python文件时启动,顶格写的)定投定义的变量,在if,while语句中的也属于全局。

    局部名称空间:(调用函数时启动,调用结束失效)函数内部定义的变量

    三者的加载顺序:内置--->全局--->局部

    三者的访问顺序:局部--->全局--->内置

    8. 装饰器

    在不修改源代码和调用方式的基础上给其增加新的功能,多个装饰器可以装饰在同一个函数上

    实例1:没有参数的装饰器

    def deco(func):

    def wrapper():

    func() #func()=func1()

    print('this is new ')

    return wrapper

    @deco #func1=wrapper func=func1

    def func1():

    print('this is ok')

    # func1=deco(func1) 这句等效于@deco

    func1() #wrapper()

    输出结果如下:

    this is ok

    this is new

    这时this is new作为新的功能被添加到func1上

    实例2:有参数的装饰器

    def deco(func):

    def wrapper(x,y):

    func(x,y) #func()=func1()

    print('this is new ')

    return wrapper

    @deco #func1=wrapper func=func1

    def func1(x,y):

    print('this is ok')

    print(x)

    print(y)

    # func1=deco(func1) 这句等效于@deco

    func1(1,2) #wrapper()

    输出结果如下:

    this is ok

    1

    2

    this is new

    9. 迭代器

    特点:迭代是一个重复的过程,即每一次重复为一次迭代,并且每次迭代的结果都是下一次迭代的初始值。

    为何要有迭代器?

    对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。

    但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,

    则必须找出一种不依赖于索引的迭代方式,这就是迭代器。

    str1 = 'hello,world'

    l1 = ['a','b','c']

    t1 = ('a','b','c')

    info = {

    'name':'程泽宇',

    'age':23

    }

    s1 = {1,2,3,3,5,9}

    f = open('a.txt','r',encoding='utf-8')

    可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如字符串,列表,字典,集合,元组

    整数,浮点数都不是可迭代对象

    str1.__iter__()

    l1.__iter__()

    t1.__iter__()

    info.__iter__()

    s1.__iter__()

    f.__iter__()

    可迭代对象执行obj.__iter__()得到的结果就是迭代器对象

    而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象

    f.__iter__()

    f.__next__()

    iter(l1)等效于l1.__iter__()

    把一个可迭代对象变成迭代器对象iter

    res=iter(l1)

    此时,可以打印出他里面的数值

    print(res.__next__())

    print(res.__next__())

    print(res.__next__())

    a

    b

    c

    next(res)等效于res.__next__()

    用while循环可以实现调用所有的数值

    i=0

    while i<len(l1):

    print(next(res))

    i+=1

    a

    b

    c

    for循环最为简单实用、

    for i in l1: #可迭代对象s1变成了迭代器对象iter(s1),#2.过滤错误

    print(i)

    总结:

    1)可迭代对象包含迭代器。

    2)如果一个对象拥有__iter__方法,其是可迭代对象;如果一个对象拥有next方法,其是迭代器。

    3)定义可迭代对象,必须实现__iter__方法;定义迭代器,必须实现__iter__和next方法。可迭代对象不一定是迭代器对象,迭代器对象一定是可迭代对象

    10. 生成器

    只要函数里有yield关键字,那么函数名()得到的结果就是生成器,并且不会执行函数内部代码。生成器就是迭代器。

    return和yield区别:

    return只能返回一个值

    yield可以返回多个值,同一时间只能存储一个值;缺点:没有索引,不能后退取值

    实例:

    return方式:

    def b():

    l=[]

    for i in range(5):

    l.append(i)

    return l

    print(b()[3])

    取出第三个数字

    yield方式:

    def b():

    for i in range(5):

    yield i

    for i in b():

    print(i)

    print()

    res=iter(b())

    print(next(res))

    print(next(res))

    print(next(res))

    0

    1

    2

    3

    4

    0

    1

    2

    11. 匿名函数

    匿名函数的定义lambda,自带return

    匿名函数通常只调用一次,之后不在使用

    print((lambda x,y:x+y)(1,2))

    3

    lambda的使用场景:

    1. max

    info={

    'a':100,

    'b':200,

    'c':500,

    'd':400,

    }

    print(max(info)) #打印出key最大的value

    d

    打印出val最大的key

    第一种方法:

    def func(k):

    return info[k]

    print(max(info,key=func))

    c

    第二种:

    print(max(info,key=lambda k:info[k]))

    C

    2.排序 sorted

    info={

    'a':100,

    'b':200,

    'c':500,

    'd':400,

    }

    以key对应的value排序顺序列出对应的key

    print(sorted(info,key=lambda k:info[k]))

    ['a', 'b', 'd', 'x']

    print(sorted(info,key=lambda k:info[k],reverse=True)) #倒序排列

    ['x', 'd', 'b', 'a']

    3.拉链 zip

    l1 = [1,2,3,4]

    l2 = ['a','b','c']

    print(list(zip(l1,l2)))

    [(1, 'a'), (2, 'b'), (3, 'c')]

    4. 映射 map

    names = ['zhao','wu','du']

    第一种:

    l1=[]

    for name in names:

    res='%s_SB' % name

    l1.append(res)

    print(l1)

    ['zhao_SB', 'wu_SB', 'du_SB']

    第二种:

    print(list(map(lambda name:'%s_SB' %name,names)))

    ['zhao_SB', 'wu_SB', 'du_SB']

    5. 过滤 filter

    names = ['zhao_sb', 'wu_sb', 'du_sb','li']

    print(list(filter(lambda i: i.endswith('_sb'),names)))

    ['zhao_sb', 'wu_sb', 'du_sb']

    print(list(filter(lambda i: not i.endswith('_sb'),names)))

    ['li']

    10. 内置函数(len,in,not in)

    10.1 len统计长度

    a={'name':'李白','age':24}

    print(len(a))

    b=['a','b','c']

    print(len(b))

    2

    3

    10.2 in 在....里面,有则true,无则false

    print('e'in 'hello')

    print('s'in 'hello')

    True

    False

    10.3 not in 不在.....里面,没有则true,有则false

    print('e'not in 'hello')

    print('s'not in 'hello')

    False

    True

  • 相关阅读:
    15.Mysql之undo 日志浅谈02
    14.Mysql之redo log -checkpoint浅谈01
    13. Mysql之二进制日志(binlog)
    [C]使用argv的5种方法
    [Python]sys.stdin.readline(), sys.stdout.write(), sys.stdin.write()
    temporadas[i][2]三种等价形式
    time.h中time(NULL),stdlib.h中srand(), rand()
    strstr函数的使用
    [C]toupper, tolower
    [Python]List Comprehension
  • 原文地址:https://www.cnblogs.com/liangzb310/p/11027002.html
Copyright © 2011-2022 走看看