python习题实例(上)_update18/07/03
用以记录python学习过程中做过的小习题~ ヾ(◍°∇°◍)ノ゙
1.生成两个列表,分别存放将100以内的偶数&奇数
odd_number=[] even_number=[] for i in range(1,101): if i%2==0: odd_number.append(i) else: even_number.append(i) print 'the odd number list is:','\n',odd_number print 'the even number list is:','\n',even_number
执行结果
the odd number list is: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100] the even number list is: [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
知识点
range()
创建一个整数列表,一般用在 for 循环中
range(start, stop[, step])
参数说明:
start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)
>>> a=range(1,5) >>> print a [1, 2, 3, 4]
list.append()
在列表末尾添加新的对象, 该方法无返回值,但是会修改原来的列表。
list.append(obj)
obj -- 添加到列表末尾的对象
>>> a=[1,2,3] >>> a.append(4) >>> a [1, 2, 3, 4]
‘\n’
换行符
>>> print 'hello','\n','world' hello world
2.生成8位密码,需包含大小写字母,数字,下划线
import random number=str(random.randint(0,9)) lower=str(chr(random.randint(97,122))) capital=str(chr(random.randint(65,90))) underline='_' type=[number,lower,capital,underline] new_type=random.choice(type) password=[number,lower,capital,underline] i=1 while i <=4: password.append(new_type) i+=1 else: random.shuffle(password) print ''.join(password)
执行结果
_yyy5yyX
_xxx7xBx
……
知识点
random模块
获取随机数模块,使用前需导入,import random。
常用函数:
random.random
返回随机生成的一个实数,它在[0,1)范围内。
>>> random.random()
0.005544345491154901
random.randint
生成一个指定范围内的整数,其中范围包含上下限
>>> random.randint(1,10)
4
random.choice
从序列中获取一个随机元素,并返回
>>> a=[1,2,3] >>> random.choice(a) 3 >>> random.choice('hello') 'l'
random.shuffle
随机排列列表中的元素,会修改列表本身。
>>> a [2, 1, 3] >>> a=[1,2,3] >>> random.shuffle(a) >>> a [3, 2, 1] >>> random.shuffle(a) >>> a [2, 3, 1]
join()
将序列中的元素以指定的字符连接生成一个新的字符串
str.join(sequence)
sequence -- 要连接的元素序列。
>>> str='-' >>> seq=['a','b','c'] >>> print str.join(seq) a-b-c
3.列表元素去重
方法一
list_a=[1,1,1,2,2] list_b=[] for i in list_a: if i in list_b: continue else: list_b.append(i) print list_b
执行结果
[1, 2]
方法二
>>> list_a=[1,1,1,2,2] >>> list(set(list_a)) [1, 2]
知识点
set()
创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等
set([iterable])
iterable -- 可迭代对象对象
>>> x=set('hello') >>> y=set('good world') >>> x,y # 重复的被删除 (set(['h', 'e', 'l', 'o']), set([' ', 'd', 'g', 'l', 'o', 'r', 'w'])) >>> x&y # 交集 set(['l', 'o']) >>> x|y # 并集 set([' ', 'e', 'd', 'g', 'h', 'l', 'o', 'r', 'w']) >>> x-y # 差级 set(['h', 'e'])
4.统计一个字符串,有多少个特定字符
统计这句话有几个字母‘a’
方法一
s='i am a boy' count=0 for i in s: if i =='a': count+=1 print count
执行结果
2
方法二
>>> s='i am a boy' >>> s.count('a') 2
知识点
count()
用于统计字符串里某个字符出现的次数。可选参数为在字符串搜索的开始与结束位置。
str.count(sub, start= 0,end=len(string))
>>> s='i am a boy' >>> s.count('a') 2 >>> s='i am a boy' >>> s.count('a',3,9) 1
对序列也可以使用
>>> ss=['1','a','a','3'] #列表 >>> ss.count('a') 2 >>> ss=('1','a','a','3') #元祖 >>> ss.count('a') 2
统计这句话有几个单词包含字母‘a’
s='i am a boy' count=0 a_word=[] new_dict=s.split(' ') for i in new_dict: if 'a' in i: count+=1 a_word.append(i) print 'count is:',count print 'word list is:',a_word
运行结果
count is: 2 word list is: ['am', 'a']
知识点
split()
通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则仅分隔 num 个子字符串
str.split(str="", num=string.count(str)).
str -- 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
num -- 分割次数。
>>> str='hello-good-world' >>> print str.split('-') ['hello', 'good', 'world']
5.判断一个数是不是质数
# -*- coding: utf-8 -*- import math number=int(raw_input('please enter a number:')) for i in range(2,int(math.sqrt(number)+1)): #平方根方法 #for i in range(2,number): if number % 2 != 0: print u'是质数' break else: print u'不是质数'
运行结果
please enter a number:89
是质数
知识点
Math模块
math.sqrt
返回数字的平方根,使用前先导入math模块
>>> import math >>> math.sqrt(6) 2.449489742783178
math.pow
返回 xy(x的y次方) 的值
math.pow( x, y )
>>> math.pow(2,3)
8.0
math.ceil/floor
向上/下取整
>>> math.ceil(1.1) 2.0 >>> math.floor(1.1) 1.0
其他几个常见函数
abs
返回数值的取绝对值
>>> abs(1) 1 >>> abs(-1) 1
round
将数值四舍五入
>>> round(1.1111) 1.0 >>> round(1.5555) 2.0
cmp
比较两个数值的大小
>>> cmp(1,1) #相等 0 >>> cmp(2,1) #大于 1 >>> cmp(1,2) #小于 -1
max&min
找出序列中最大/最小的数值
>>> max([1,2,3,4]) 4 >>> min([1,2,3,4]) 1
6.输入一组数字,将每位数字加1后输出
方法一 number=str(int(raw_input('enter a number:'))) new_number='' for i in number: i_new=int(i)+1 new_number+=str(i_new) print int(new_number) 方法二 number=raw_input('enter a number:') list1=[] list2=[] for i in number: list1.append(i) for j in list1: list2.append(str(int(j)+1)) print int(''.join(list2)) 方法三 >>> int(''.join(map(lambda x:str(int(x)+1),'123'))) 234
运行结果
enter a number:123 234
知识点
lambda
lambda表达式,通常是在需要一个函数,但是又不想命名一个函数的场合下使用,也就是指匿名函数。
创建语法:lambda parameters:express
parameters:可选,如果提供,通常是逗号分隔的变量表达式形式,即位置参数。
expression:不能包含分支或循环(但允许条件表达式),也不能包含return(或yield)函数。如果为元组,则应用圆括号将其包含起来。
eg >>> s=lambda x:x+1 #传入一个参数 >>> print s(1) 2 >>> p=lambda x,y:x+y #传入多个参数 >>> print p(1,2) 3 >>> s=lambda x:'yes' if x==1 else 'no' #条件表达式 >>> s(0) 'no' >>> s(1) 'yes'
PS:
Lambda函数返回值是一个地址,即函数对象
>>> lambda x:x+1
<function <lambda> at 0x0000000002E53CF8>
map()
根据提供的函数对指定序列做映射,并返回一个新的序列
函数语法:map(function, iterable, ...)
function -- 函数
iterable -- 一个或多个序列
eg.
>>> def x(s): return s+1 >>> map(x,[1,2,3]) #包含一个参数 [2, 3, 4] >>> map(lambda x,y:x+y,[1,2,3],[10,20,30]) #包含两个参数 [11, 22, 33]
7.阶乘函数
def factorial(x): result=1 if not isinstance(x,int): raise TypeError('bad operand type') if x> 0: for i in range(1,x+1): result*=i return result elif x==0: return '1' else: return 'please enter a positive number' print factorial('s') print factorial(3) print factorial(-1) print factorial(0)
运行结果
print factorial('s') #非整数 raise TypeError('bad operand type') TypeError: bad operand type print factorial(3) #正整数 6 print factorial(-1) #负数 please enter a positive number print factorial(0) #0 1
知识点
isinstance()
用来判断一个对象是否是一个已知的类型,类似 type()
isinstance() 与 type() 区别:
type() 不会认为子类是一种父类类型,不考虑继承关系。
isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()。
语法:isinstance(object, classinfo)
object -- 实例对象。
classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组。
如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。
eg
>>> isinstance(1,int) True >>> isinstance(1,str) False >>> isinstance(1,(str,int,list)) # 如果是元组中的其中一个则返回True True
raise()
raise语句来引发一个异常。异常/错误对象必须有一个名字,且它们应是Error或Exception类的子类。
eg.
>>> def ThrowErr(): raise Exception('my name is error') >>> ThrowErr() Traceback (most recent call last): File "<pyshell#44>", line 1, in <module> ThrowErr() File "<pyshell#43>", line 2, in ThrowErr raise Exception('my name is error') Exception: my name is error
8.定义一个函数,可以设定不定个数的形参,返回形参中的乘方和
def powersum(power,*args): total=0 for i in args: total+=pow(i,power) return total
运行结果
print powersum(2,3) 9 print powersum(2,3,4) 25 print powersum(2,3,4,5) 50
知识点
*args 和**args都可以接受可变长度的参数个数
*args :表示的是可变参数的元祖
**args:表示的是可变参数的字典
pow()
内置pow函数
语法:pow(x, y[, z])
计算x的y次方,如果z在存在,则再对结果进行取模
eg.
>>> pow(2,3) 8 >>> pow(2,3,4) 0 >>> pow(2,3,5) 3
PS:
与math.pow的区别
pow() 通过内置的方法直接调用,内置方法会把参数作为整型,而 math 模块则会把参数转换为 float。
9.定义一个函数,使用可变参数字典,计算所有参数的key和value的长度,并返回结果
def count_length(**args): result=0 for key,value in args.items(): result+=len(str(key)) result+=len(str(value)) return result print count_length(a='hello',b='world')
运行结果
12
知识点
dict.item()
以列表返回可遍历的(键, 值) 元组数组。
eg.
>>> dict={'name':'hello','age':15} >>> print dict.items() [('age', 15), ('name', 'hello')] >>> for key,value in dict.items(): print key,value age 15 name hello
10.查询列表中元素是列表的个数
方法一: a=[1,[2],[3],'a'] j=0 for i in a: if isinstance(i,list): j+=1 print j 运行结果: 2
方法二: >>> a=[1,[2],[3],'a'] >>> len(filter(lambda x:isinstance(x,list),a)) 2
知识点
Filter
用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表
语法:filter(function, iterable)
function -- 判断函数。
iterable -- 可迭代对象。
#过滤小写字母,返回大写字母
方法一 def f(s): if s>='a' and s<='z': return else: return s print filter(f,'AABBaabb') 方法二: >>> import string >>> filter(lambda x:x in string.uppercase,'AABBaabb') # string.uppercase返回所有大写字母 'AABB'
注: Python2中filter返回一个列表,而python3中返回一个类,py 3代码如下: >>> a=[1,[2],[3],'a'] >>> len(list(filter(lambda x:isinstance(x,list),a))) 2
#删除列表中等于4的元素
方法一 a=[1,2,4,4,4,4,5,6] num=a.count(4) for i in a: if i == 4: while num>0: a.remove(i) num-=1 print a 运行结果: [1, 2, 5, 6] 方法二: >>> a=[1,2,4,4,4,4,5,6] >>> filter(lambda x:x!=4,a) [1, 2, 5, 6]
11.按照列表的长度倒序排列
list1=[(1,5,6),(1,2,3,4),(1,1,2,3,4,5),(1,9)] def l(tup): return len(tup) list1.sort(key=l,reverse=True) print list1
知识点
L.sort(cmp=None,key=None,reverse=False)
key:从每个元素提起一个用于比较的关键字
reverse:接受false或者true,表示是否逆序。True,表示逆序
#按照列表第一个元素的大小排序
list1=[(1,5,6),(7,2,3,4),(8,1,2,3,4,5),(2,9)] def L(tup): return tup[0] list1.sort(key=L) print list1 运行结果: [(1, 5, 6), (2, 9), (7, 2, 3, 4), (8, 1, 2, 3, 4, 5)]
12.将两个list的对应位元素合并
方法一: list1=[1,2,3] list2=[4,5,6] list3=[] for i in range(len(list1)): for j in range(len(list2)): if i==j: tup=(list1[i],list2[j]) list3.append(tup) print list3 方法二: >>> zip([1,2,3],[4,5,6]) [(1, 4), (2, 5), (3, 6)]
知识点
zip()
用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
注意:python 3中zip返回的是一个地址,需要用list转化一下
>>> zip([1,2,3],[4,5,6]) <zip object at 0x000000000290FB88> >>> list(zip([1,2,3],[4,5,6])) [(1, 4), (2, 5), (3, 6)]
已经压缩过的列表,添加个*号,即为解压
>>> a=[1,2,3] >>> b=[4,5,6] >>> s=zip(a,b) >>> zip(*s) [(1, 2, 3), (4, 5, 6)]
13.生成一个0~8的二维列表
result=[] num=0 for i in range(3): x=[] for j in range(3): x.append(num) num+=1 result.append(x) print result 运行结果: [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
14.二维列表转置
方法一: A=[[1,2,3], [4,5,6], [7,8,9], [10,11,12]] result=[] for i in range(3): L=[] for j in range(4): L.append(A[j][i]) result.append(L) print result 方法二: >>> A=[[1,2,3],[4,5,6],[7,8,9],[10,11,12]] >>> print [ [ j [ i ] for j in A]for i in range(3) ]
运行结果: [[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]
知识点
推导列表
格式:[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]
PS:支持for if循环,但是不支持else
>>> [x for x in range(5)] [0, 1, 2, 3, 4] >>> [x+1 for x in range(5)] [1, 2, 3, 4, 5] >>> [x+y for x in [1,2,3] for y in [4,5,6]] [5, 6, 7, 6, 7, 8, 7, 8, 9]
15.交换字典key与value的位置
d={'a':1,'b':2} new_d={} for i,j in d.items(): new_d[j]=i print new_d
上篇结束 ,撒花✿✿ヽ(°▽°)ノ✿