zoukankan      html  css  js  c++  java
  • Python3学习(二)-递归函数、高级特性、切片

     1 ##import sys
     2 ##sys.setrecursionlimit(1000)
     3 ###关键字参数(**关键字参数名)
     4 ###与可变参数不同的是,关键字参数可以在调用函数时,传入带有参数名的参数,这些参数会自动组装成一个
     5 ###dict,参数名为key,参数值为value
     6 ##def person(name,age,**kv):
     7 ##    print('name',name,'age',age,'关键字参数',kv)
     8 ##person('jian',18,tell=174,weight=71)#name jian age 18 关键字参数 {'tell': 174, 'weight': 71}
     9 ###可见,关键字参数可以传入一些非必要的参数,扩展功能。
    10 ###也可以像可能参数的函数一样,把参数组装成一个dict,然后传进去。
    11 ##extra = {'city':'Beijing','job':'Engineer'}
    12 ##person('jian',19,**extra)#name jian age 19 关键字参数 {'city': 'Beijing', 'job': 'Engineer'}
    13 
    14 ###命名关键字参数(*,参数名1,2......),用'*'号作为分隔符。
    15 ###在关键字参数的基础上,如果要指定传入参数的名称,则要用命名关键字参数,在*,后写参数名
    16 ##def person1(name,age,*,job,like):
    17 ##    print(name,age,job,like)
    18 ##person1('jian',18,job='bianchen',like='play')#jian 18 bianchen play
    19 ###person1('jian',18,like='play')#TypeError: person1() missing 1 required keyword-only argument: 'job'
    20 ###上面一行报错,说明命名关键字参数的每个参数都要传入参数值,但参数的位置可以不固定。如:
    21 ##person1('jianweiwei',19,like='play',job='learn')#jianweiwei 19 learn play.
    22 ###如果命名关键字参数有默认值则可以不用传参数。
    23 
    24 ###参数定义顺序
    25 ###python中可变参数不可以和命名关键字参数混合使用,参数定义的顺序是:必选参数、默认参数、可变参数/命名关键字参数和关键字参数
    26 ##def f1(a,b,c=0,*args,**kw):
    27 ##    print('a=',a,'b=',b,'c=',c,'args=',args,'kw=',kw)
    28 ##def f2(a,b,c=0,*,d,**kw):
    29 ##    print('a=',a,'b=',b,'c=',c,'d=',d,'kw=',kw)
    30 ###在函数调用时,Python解释器自动按照参数位置和参数名把对应的参数传进去。
    31 ##f1('我是a','我是b','我是c','1',2,3,4,{'name':'jian','age':13})
    32 ###打印结果a= 我是a b= 我是b c= 我是c args= ('1', 2, 3, 4, {'age': 13, 'name': 'jian'}) kw= {}
    33 ###可以看到,关键字参数为空的字典,可变参数为一个元组,那么怎么把列表传给关键字参数,而不是可变参数呢。
    34 ##mm = {'name':'jian','age':13}
    35 ##f1('我是a','我是b','我是c','1',2,3,4,**mm)#a= 我是a b= 我是b c= 我是c args= ('1', 2, 3, 4) kw= {'age': 13, 'name': 'jian'}
    36 ###可以看到结果,可变参数,组都有数据了,就是通过指定传入的参数类型,在前面加上*,或**,来区别可变函数与关键字参数
    37 
    38 ###参数小结:
    39 ###默认参数一定不是可变参数,如果是可变参数,会造成逻辑错误,如
    40 ##def a1(a,b,c=8):
    41 ##    print(a,b,c)
    42 ###上面默认参数指向不可变参数8,这样写正确。
    43 ##def a2(a,b,c=[]):
    44 ##    print(a,b,c)
    45 ###上面默认参数指向为可变的list,写法错误。
    46 
    47 
    48 ####递归函数
    49 ###在函数内部,可以调用其他函数,如果一个函数在内部调用自身本身,这个函数就是递归函数。
    50 ##def fact(n):
    51 ##    if n==1:
    52 ##        return 1
    53 ##    return n*fact(n-1)#这里不是尾递归,返回引入了乘法表达式。
    54 ##a = fact
    55 ##print(a(10))
    56 ###在测试输入参数值1000时会导入栈溢出,此时通过尾递归优化,事实上尾递归和循环的效果是一样的。可以把
    57 ###循环看作是尾递归的一种。
    58 ###尾递归是指:在函数返回的时候,调用自身本身,每一步的乘积传入到递归函数中:
    59 ##def fact1(n):
    60 ##    return fact_iter(n,1)
    61 ##def fact_iter(num,product):
    62 ##    if num == 1:
    63 ##        return product
    64 ##    return fact_iter(num-1,num*product)
    65 ##print(fact1(1000))#作者好坑,原来最后才说python也没有做栈优化,我说怎么老是溢出错误。
    66 
    67 #练习
    68 #尼麻啊,我不会555555555555555555
    69 
    70 #高级特性:就是实现相同的功能,写的代码越少越好。
    71 ##L = []
    72 ##i = 1
    73 ##while i<=9:
    74 ##    L.append(i)
    75 ##    i = i+1
    76 ##    print(L)
    77 
    78 
    79 ##切片
    80 #所谓的切片有点像java里的截取。无论正序还是倒序,下标第一个都是0,或-0.
    81 #第一冒号前后的数据是用来
    82 L = [1,3,4,5,2,3,4,5,6,67,77,22,33,444,2222,777]
    83 #切前3个下来
    84 print(L[0:3])
    85 print(L[0:4])#前四个
    86 #也可以每隔2个切一个
    87 print(L[::2])#
    88 #从切取的范围中每隔3个切一个
    89 print(L[-6:-2:2])#[77, 33],指从倒数下标为-6切到下标为-2,再每次隔2个切一个。
    90 #字符串也能切片,但切片应该是重新创建一个新的字符串,而不是直接切原来的字符串,因为字符串是不可变的
    91 #元组切片是生成一个新的元组。
    92 
    93 ##迭代:对list或tuple的遍历称为迭代。
  • 相关阅读:
    python并发之concurrent.futures
    全局解释器锁--GIL
    ASP 注释
    ASPxGridView 下拉框不让输入
    leftjoin及多个leftjoin执行顺序
    视图view没有主键,但可以添加唯一索引
    ASPxGridView KeyFieldName
    联合主键
    AspxGridView使用教程
    ASP Session 对象
  • 原文地址:https://www.cnblogs.com/jww-love-study/p/5443357.html
Copyright © 2011-2022 走看看