Python3学习(二)-递归函数、高级特性、切片
##import sys
##sys.setrecursionlimit(1000)
###关键字参数(**关键字参数名)
###与可变参数不同的是,关键字参数可以在调用函数时,传入带有参数名的参数,这些参数会自动组装成一个
###dict,参数名为key,参数值为value
##def person(name,age,**kv):
## print('name',name,'age',age,'关键字参数',kv)
##person('jian',18,tell=174,weight=71)#name jian age 18 关键字参数 {'tell': 174, 'weight': 71}
###可见,关键字参数可以传入一些非必要的参数,扩展功能。
###也可以像可能参数的函数一样,把参数组装成一个dict,然后传进去。
##extra = {'city':'Beijing','job':'Engineer'}
##person('jian',19,**extra)#name jian age 19 关键字参数 {'city': 'Beijing', 'job': 'Engineer'} ###命名关键字参数(*,参数名1,2......),用'*'号作为分隔符。
###在关键字参数的基础上,如果要指定传入参数的名称,则要用命名关键字参数,在*,后写参数名
##def person1(name,age,*,job,like):
## print(name,age,job,like)
##person1('jian',18,job='bianchen',like='play')#jian 18 bianchen play
###person1('jian',18,like='play')#TypeError: person1() missing 1 required keyword-only argument: 'job'
###上面一行报错,说明命名关键字参数的每个参数都要传入参数值,但参数的位置可以不固定。如:
##person1('jianweiwei',19,like='play',job='learn')#jianweiwei 19 learn play.
###如果命名关键字参数有默认值则可以不用传参数。 ###参数定义顺序
###python中可变参数不可以和命名关键字参数混合使用,参数定义的顺序是:必选参数、默认参数、可变参数/命名关键字参数和关键字参数
##def f1(a,b,c=0,*args,**kw):
## print('a=',a,'b=',b,'c=',c,'args=',args,'kw=',kw)
##def f2(a,b,c=0,*,d,**kw):
## print('a=',a,'b=',b,'c=',c,'d=',d,'kw=',kw)
###在函数调用时,Python解释器自动按照参数位置和参数名把对应的参数传进去。
##f1('我是a','我是b','我是c','1',2,3,4,{'name':'jian','age':13})
###打印结果a= 我是a b= 我是b c= 我是c args= ('1', 2, 3, 4, {'age': 13, 'name': 'jian'}) kw= {}
###可以看到,关键字参数为空的字典,可变参数为一个元组,那么怎么把列表传给关键字参数,而不是可变参数呢。
##mm = {'name':'jian','age':13}
##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'}
###可以看到结果,可变参数,组都有数据了,就是通过指定传入的参数类型,在前面加上*,或**,来区别可变函数与关键字参数 ###参数小结:
###默认参数一定不是可变参数,如果是可变参数,会造成逻辑错误,如
##def a1(a,b,c=8):
## print(a,b,c)
###上面默认参数指向不可变参数8,这样写正确。
##def a2(a,b,c=[]):
## print(a,b,c)
###上面默认参数指向为可变的list,写法错误。 ####递归函数
###在函数内部,可以调用其他函数,如果一个函数在内部调用自身本身,这个函数就是递归函数。
##def fact(n):
## if n==1:
## return 1
## return n*fact(n-1)#这里不是尾递归,返回引入了乘法表达式。
##a = fact
##print(a(10))
###在测试输入参数值1000时会导入栈溢出,此时通过尾递归优化,事实上尾递归和循环的效果是一样的。可以把
###循环看作是尾递归的一种。
###尾递归是指:在函数返回的时候,调用自身本身,每一步的乘积传入到递归函数中:
##def fact1(n):
## return fact_iter(n,1)
##def fact_iter(num,product):
## if num == 1:
## return product
## return fact_iter(num-1,num*product)
##print(fact1(1000))#作者好坑,原来最后才说python也没有做栈优化,我说怎么老是溢出错误。 #练习
#尼麻啊,我不会555555555555555555 #高级特性:就是实现相同的功能,写的代码越少越好。
##L = []
##i = 1
##while i<=9:
## L.append(i)
## i = i+1
## print(L) ##切片
#所谓的切片有点像java里的截取。无论正序还是倒序,下标第一个都是0,或-0.
#第一冒号前后的数据是用来
L = [1,3,4,5,2,3,4,5,6,67,77,22,33,444,2222,777]
#切前3个下来
print(L[0:3])
print(L[0:4])#前四个
#也可以每隔2个切一个
print(L[::2])#
#从切取的范围中每隔3个切一个
print(L[-6:-2:2])#[77, 33],指从倒数下标为-6切到下标为-2,再每次隔2个切一个。
#字符串也能切片,但切片应该是重新创建一个新的字符串,而不是直接切原来的字符串,因为字符串是不可变的
#元组切片是生成一个新的元组。 ##迭代:对list或tuple的遍历称为迭代。
Python3学习(二)-递归函数、高级特性、切片的更多相关文章
- Python高级特性(切片,迭代,列表生成式,生成器,迭代器)
掌握了Python的数据类型.语句和函数,基本上就可以编写出很多有用的程序了. 比如构造一个1, 3, 5, 7, ..., 99的列表,可以通过循环实现: L = [] n = 1 while n ...
- Spring框架学习[IoC容器高级特性]
1.通过前面4篇文章对Spring IoC容器的源码分析,我们已经基本上了解了Spring IoC容器对Bean定义资源的定位.读入和解析过程,同时也清楚了当用户通过getBean方法向IoC容器获取 ...
- 深入浅出Redis(二)高级特性:事务
第一篇中介绍了Redis是一个强大的键-值仓储,支持五种灵活的数据结构.其实,Redis还支持其他的一些高级特性:事务.公布与订阅.管道.脚本等,本篇我们来看一下事务. 前一篇中我们提到,在Redis ...
- Python学习笔记(二)——高级特性
知识点 切片 切片 取一个list或tuple的部分元素. 原理:调用__getitem__,__setitem__,__delitem__和slice函数. 根据官方的帮助文档(https://do ...
- 【Python学习之五】高级特性1(切片、迭代、列表生成器、生成器、迭代器)
1.切片 有一个list—>L = [1,2,3,4,5,6,7]或tuple—>T = (1,2,3,4,5,6,7),如果想取得前三个元素,怎么操作? 硬方法,也是低效的方法是:L= ...
- 【Python学习之五】高级特性5(切片、迭代、列表生成器、生成器、迭代器)
5.迭代器 由之前的生成器可知,for循环用于可迭代对象:Iterable.包括集合数据类型: list.tuple.dict.set.str 等,以及两种生成器.判断迭代器,使用 isinstanc ...
- 【Python学习之五】高级特性4(切片、迭代、列表生成器、生成器、迭代器)
4.生成器(generator) 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的 ...
- 【Python学习之五】高级特性3(切片、迭代、列表生成器、生成器、迭代器)
3.列表生成器(List Comprehensions) 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式.举个例子,要生成list ...
- 【Python学习之五】高级特性2(切片、迭代、列表生成器、生成器、迭代器)
2.迭代 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration).在Python中,迭代是通过for ... in来完成的. ...
- Scala学习(二)——高级特性
apply() 方法 apply方法是Scala提供的一个语法糖 类名+括号,调用对象的apply方法 对象名+括号,调用类的apply方法 对apply方法的简单测试:(其中,带 new -- cl ...
随机推荐
- 运行 Spark on YARN
运行 Spark on YARN Spark 0.6.0 以上的版本添加了在yarn上执行spark application的功能支持,并在之后的版本中持续的 改进.关于本文的内容是翻译官网的内容,大 ...
- Sublime Text 配置记录
sublime userSetting sublime theme sublime plug sublime userSetting 对sublime的配置 { "color_scheme& ...
- django数据库的增删改查
正常启动服务安装数据库cmd命令:python manage.py makemigrations 创建用户 在pxm里面会有一个py文件..这就是生成了表结构cmd命令:python manage.p ...
- HTML <a> download 属性,点击链接来下载图片
Html5里面的 标签的 Download 属性可以设置一个值来规定下载文件的名称.所允许的值没有限制,浏览器将自动检测正确的文件扩展名并添加到文件 (.img, .pdf, .txt, .html, ...
- Android 异步消息处理机制
1.Handler的由来 当程序第一次启动的时候,Android会同时启动一条主线程( Main Thread)来负责处理与UI相关的事件,我们叫做UI线程. Android的UI操作并不是线程安全的 ...
- jvm之直接内存的影响
直接内存 直接内存是一个重要的问题,首先它不是运行数据区的部分也不是java虚拟机规范的一部分,这个的出现主要和java1.4后出现的NIO相关,一个基于通道和缓冲区的io方式,它可以使用Native ...
- [经验] 新版SkyIAR、Easy Image X在有些PE里不能运行的解决办法
[经验] 新版SkyIAR.Easy Image X在有些PE里不能运行的解决办法 xxwl2008 发表于 2013-1-26 11:58:38 https://www.itsk.com/threa ...
- Android 开发如何选择轮子(转)
一个项目的开发,我们不可能一切从0做起,如果真是这样,那同样要哭瞎.因此,善于借用已经做好的 "车轮" 非常重要,如: 网络访问框架:OKHttp.retrofit.android ...
- Docker实践,来自沪江、滴滴、蘑菇街架构师的交流分享
架构师小组交流会:每期选一个时下最热门的技术话题进行实践经验分享. 第一期主题:容器实践.Docker 作为当前最具颠覆性的开源技术之一,其轻量虚拟化.可移植性是CI/CD,DevOps,微服务的重要 ...
- javascrpt事件
1.HTML事件处理程序:就是事件直接写在HTML文档中,其特点就是HTML和Js紧密的结合在一起,缺点就是修改不方便,需要改动js和HTML两处.比如: <button onclick=&qu ...