内容简介:Python学习/复习神器-->各种方法/技巧在哪用和典型例子(一)
就我个人在学习 Python 的过程中,经常会出现学习了新方法后,如果隔上几天不用,就忘了的情况,或者刚学习的更好的方法没有得到应用,还是沿用已有的方法,这样很不利于学习和掌握新姿势,从而拉长学习时间,增加学习成本。
为此,我觉得有必要把各种方法或者技巧的用处和其典型例子记录下来,方便在空闲时间翻阅,并在实操上合理应用,对提高掌握新姿势的效率会很有好处。
注意:以下基于Python3
基础篇
一、数据类型
1.list中增加元素,追加元素到末尾:list. append (‘元素’)、插入到指定的位置:list. insert (‘索引号’,‘元素’);删除末尾的元素:list. pop 、删除指定位置的元素:list. pop (‘索引号’)
2.input()返回的数据类型是 str
3.迭代/循环: for x in ...
把每个元素代入变量 x
,然后执行缩进块的语句
4.dict中避免key不存在的错误2种方法,1、通过 in
判断key是否存在:'Jia' in dict 返回Ture或False 2、通过dict提供的get()方法:dict.get('Yannan');删除元素:dict. pop(key)
5.set:和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。要创建一个set,需要提供一个list作为输入集合: s = set([1,2,3]).
添加元素: s.add(key) 删除元素: s.remove(key)。 set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:交集& 并集 |
6.列表倒序方法:list = [3,5,4] list.sort() >>[3,4,5]
7.字符串的元素替代方法:s = 'abc' s. replace ('a','A') >>'Abc' 谨记变量s仍是'abc' 原因是 replace 方法创建了一个新的字符串'Abc'
二、函数
1.函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”:ads(-100) >>100 a = abs a(-67) >>67
2.空函数
1 def nop(): 2 pass
pass语句什么都不做,那有什么用?实际上 pass
可以用来作为 占位符
,比如现在还没想好怎么写函数的代码,就可以先放一个 pass
,让代码能运行起来。
pass还可以用在其他语句里,比如:
1 if age >=18: 2 pass
缺少了pass,代码运行就会有语法错误。
3.函数可以同时返回多个值,但其实就是一个 tuple
4.函数执行完毕也没有return语句时,自动return None
5.如果有必要,可以 先对参数的数据类型做检查
6.除了正常定义的 必选参数 外,还可以使用 默认参数 、 可变参数、 关键字参数和 命名关键字参数 ,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码
7.计算x的n次方的方法,使用while循环
1 def power(x, n): 2 s = 1 3 while n > 0: 4 n = n - 1 5 s = s * x 6 return s
8. 可变参数 计算a2 + b2 + c2 + ……
1 def calc(*numbers): 2 sum = 0 3 for n in numbers: 4 sum = sum + n * n 5 return sum
9.关键字参数
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
1 def person(name, age, **kw): 2 print('name:', name, 'age:', age, 'other:', kw)
关键字参数有什么用?它可以扩展函数的功能。比如,在 person
函数里,我们保证能接收到 name
和 age
这两个参数,但是,如果调用者愿意提供更多的参数,我们也能收到。试想你正在做一个用户注册的功能,除了用户名和年龄是必填项外,其他都是可选项,利用关键字参数来定义这个函数就能满足注册的需求。
10. 命名关键字参数 命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。
1 def person(name, age, *, city, job): 2 print(name, age, city, job)
和关键字参数 **kw
不同,命名关键字参数需要一个特殊分隔符 *
, *
后面的参数被视为命名关键字参数
11.递归函数 计算阶乘 n!
1 def fact(n): 2 if n==1: 3 return 1 4 return n * fact(n - 1)
递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。缺点是过深的调用会导致栈溢出。
12.切片
L[0:3]
表示,从索引 0
开始取,直到索引 3
为止,但不包括索引 3
。即索引 0
, 1
, 2
,正好是3个元素。
L = list(range(10)) >>L[:9:2] >>[0, 2, 4, 6, 8] 第三个数字是步长
13.迭代
在Python中,迭代是通过
for ... in
来完成的
迭代dict中的key、value、key和value: for key in dict、for value in d.values()、for k,v in d.items()
如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断:
>>> from collections import Iterable >>> isinstance('abc', Iterable) # str 是否可迭代 True >>> isinstance([1,2,3], Iterable) # list 是否可迭代 True >>> isinstance(123, Iterable) # 整数 是否可迭代 False
14.列表生成式
>>> [x * x for x in range(1, 11) if x % 2 == 0] [4, 16, 36, 64, 100]
还可以使用两层循环,可以生成全排列:
>>> [m + n for m in 'ABC' for n in 'XYZ'] ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
运用列表生成式,可以写出非常简洁的代码。例如, 列出当前目录下的所有文件和目录名 ,可以通过一行代码实现:
>>> import os # 导入os模块 >>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目录
打印dict中的 key=value,并输出一个列表:
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' } >>> [k + '=' + v for k, v in d.items()] ['y=B', 'x=A', 'z=C']
把一个list中所有的字符串变成小写:
>>> L = ['Hello', 'World', 'IBM', 'Apple'] >>> [s.lower() for s in L] ['hello', 'world', 'ibm', 'apple']
15.生成器
g = (x * x for x in range(10))
>>> next(g) 0 >>> next(g) 1
generator保存的是算法,每次调用 next(g)
,就计算出 g
的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出 StopIteration
的错误。
当然,上面这种不断调用 next(g)
实在是太变态了,正确的方法是使用
for
循环
,因为generator也是 可迭代对象
:
>>> g = (x * x for x in range(10)) >>> for n in g: ... print(n)
所以,我们创建了一个generator后,基本上永远不会调用 next()
,而是通过 for
循环来迭代它,并且不需要关心 StopIteration
的错误。
斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:
1, 1, 2, 3, 5, 8, 13, 21, 34, ...
1 def fib(max): 2 n, a, b = 0, 0, 1 3 while n < max: 4 print(b) 5 a, b = b, a + b 6 n = n + 1 7 return 'done'
16.迭代器
生成器都是 Iterator
对象,但 list
、 dict
、 str
虽然是 Iterable(可迭代对象)
,却不是 Iterator(迭代器)
。
把 list
、 dict
、 str
等 Iterable
变成 Iterator
可以使用 iter()
函数:
>>> isinstance(iter([]), Iterator) True >>> isinstance(iter('abc'), Iterator) True
凡是可作用于 for
循环的对象都是 Iterable
类型;
凡是可作用于 next()
函数的对象都是 Iterator
类型,它们表示一个惰性计算的序列;
集合数据类型如 list
、 dict
、 str
等是 Iterable
但不是 Iterator
,不过可以通过 iter()
函数获得一个 Iterator
对象。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数据结构与算法分析
韦斯 (Mark Allen Weiss) / 陈越 / 机械工业出版社 / 2016-3-1 / 69.00元
本书是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计)。本书把算法分析与有效率的Java程序的开发有机地结合起来,深入分析每种算法,内容全面、缜密严格,并细致讲解精心构造程序的方法。一起来看看 《数据结构与算法分析》 这本书的介绍吧!