Python入门学习笔记(四)——递归、字典、集合

Python学习(四)

目录

Python学习(四)

Python之递归    

求阶乘

 斐波那契数列的实现

汉诺塔

Python之字典

创建和访问字典   

修改

添加

内建方法

Python之集合

创建集合

去除列表中重复的元素

访问集合中的值

不可变集合


Python之递归    

求阶乘

循环求阶乘,创建一个.py文件:

def factorial(n):
    result = n
    for i in range(1,n):
        result*=i
    return result
number = int(input('输入:'))
result = factorial(number)
print('%d的阶乘是:%d'%(number,result))

   运行,输入数字,结果如下:

           

递归求阶乘,创建一个.py文件:

def factorial(n):
    if n == 1:
        return 1
    else:
        return n*factorial(n-1)  
number = int(input('输入:'))
result = factorial(number)
print('%d的阶乘是:%d'%(number,result))

结果同上。 

可以手动设置递归的深度,python默认100

 >>>import sys

 >>>sys,setrecursionlimit(1000)

 斐波那契数列的实现

迭代法,创建一个.py文件:

def fab(n):
    n1 = 1
    n2 = 1
    n3 = 1
    if n < 1:
        print('输入有误!')
        return -1
    while(n-2) > 0:
        n3 = n1 + n2
        n1 = n2
        n2 = n3
        n -= 1
    return n3
result = fab(20)
if result != -1:
    print('结果:%d' %result)
        

运行结果

递归法,创建一个.py文件:

def fab(n):
    if n < 1:
        print('输入有误!')
        return -1
    if n == 1 or n==2:
        return 1
    else:
        return fab(n-1)+fab(n-2)
result = fab(20)
if result != -1:
    print('结果:%d' %result)

结果同上,递归40次就需要一定的时间了,但是迭代会很快。

 

汉诺塔

代码如下:

def hanoi(n, x, y, z):
    if n == 1:
         print(x,'->',z)
    else:
        hanoi(n-1, x, z, y) #将前n-1个盘子从x移动到y上
        print(x,'->',z) #将最底下的最后一个盘子从x移动到z上
        hanoi(n-1, y, x, z)#将y上的n-1个盘子移动到z上
n = int(input('请输入汉诺塔的层数:'))
hanoi(n, 'x', 'y', 'z')

结果如下:

   

Python之字典

       字典是Python中唯一的映射类型

       当索引不要用时—字典

看一个例子:

>>> brand = ['李宁','耐克','阿迪达斯']
>>> slogan = ['一切皆有可能','Just do it','Impossible is nothing']
>>> print('耐克的口号是:',slogan[brand.index('耐克')])
耐克的口号是: Just do it

使用字典:

>>> dict1 = {'李宁':'一切皆有可能','耐克':'Just do it','阿迪达斯':'Impossible is nothing'}
>>> print('耐克的口号是:',dict1['耐克'])
耐克的口号是: Just do it

创建和访问字典   

方式一:

>>> dict2 = {1:'one',2:'two',3:'three'}
>>> dict2[2]
'two'
>>> dict3 = {}        #空

方式二:

>>> dict3 = dict((('F',70),('i',105),('s',115),('h',104)))#伪装成只有一个参数,是一个元组
>>> dict3
{'F': 70, 'i': 105, 's': 115, 'h': 104}

方式三:

>>> dict4 = dict{a='A',b='B'}

修改

>>> dict4['a'] = 'AA'

添加

>>> dict4['c'] = 'C'

内建方法

>>> dict1 = { }
>>> dict1.fromkeys((1,2,3))
{1:'None',2:'None',3:'None'}
>>> dict1.fromKeys((1,2,3),'Number')
{1:'Number',2:'Number',3:'Number'}
#不能分别设置值,也不能批量修改值
>>> dict1 = dict1.fromkeys(range(32),'赞')
>>> dict1
{0: '赞', 1: '赞', 2: '赞', 3: '赞', 4: '赞', 5: '赞', 6: '赞', 7: '赞', 8: '赞', 9: '赞', 10: '赞', 11: '赞', 12: '赞', 13: '赞', 14: '赞', 15: '赞', 16: '赞', 17: '赞', 18: '赞', 19: '赞', 20: '赞', 21: '赞', 22: '赞', 23: '赞', 24: '赞', 25: '赞', 26: '赞', 27: '赞', 28: '赞', 29: '赞', 30: '赞', 31: '赞'}

获取key值

>>> dict1.keys()
dict_keys([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31])
>>> for eachKey in dict1.keys():
	print(eachKey)

	
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

获取value值

>>> dict1.values()
dict_values(['赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞'])
>>> for eachValue in dict1.values():
	print(eachValue)

	
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞
赞

访问字典中不存在的项

>>> dict1.get(32)
>>> print(dict1.get(32))   #访问字典中不存在的项,用get不会报错,直接打印会抛出异常
SyntaxError: invalid character in identifier
>>> dict1.get(32,'木有')   #不存在会打印木有,存在打印值
'木有'

是否存在

>>> 31 in dict1
True
>>> 32 in dict1
False

清空

>>> dict1.clear() #建议使用这种方法
#直接让dict1指向空字典,不严谨,(dict1 = { })

拷贝

>>> a = {1:'one',2:'two',3:'three'}
>>> b = a.copy
>>> c = a
#a与c的位置相同,与b的位置不同(用id(a)查看a的地址)

 给定键,弹出对应的值

>>> a.pop(2)
'two'
>>> a
{1: 'one', 3: 'three'}

弹出一个的项(随机)

>>> a.popitem()
(3, 'three')

与get类似,但是找不到对应的键时,会自动添加

>>> a.setdefault(4)
>>> a
{1: 'one', 4: None}
#找不到4,就会自动添加(4,None)

用b更新a

>>> b
{4: 'four'}
>>> a
{1: 'one', 4: None}
>>> a.update(b)
>>> a
{1: 'one', 4: 'four'}

Python之集合

创建集合

  1. 直接把一堆元素用花括号括起来
  2. 使用set()工厂函数
>>> num2 = {1,2,2,3,4,4,5,5}
>>> num2
{1,2,3,4,5}
#会自动清除重复的元素
#集合中元素无序,不支持索引
>>> set1 = set([1,2,3,4,5,5])

>>> set1

{1,2,3,4,5}

去除列表中重复的元素

>>> num1 = [1,2,3,4,5,5,3,1,6]
>>> temp = []
>>> for each in num1:
	if each not in temp:
		temp.append(each)

		
>>> temp
[1, 2, 3, 4, 5, 6]

法二:

>>> num1 = list(set(num1))
>>> num1
[1, 2, 3, 4, 5, 6]
#转换为集合,在转换为列表

访问集合中的值

可以使用for把集合中的数据一个个读取出来

可以通过in和not in判断一个元素是否在集合中已经存在

>>> 1 in num2

True

>>> num2.add(6)

>>> num2.remove(5)

{1,2,3,4,6}

不可变集合

>>> num3 = frozenset([1,2,3,4,5])
>>> num3.add(8)
Traceback (most recent call last):
  File "<pyshell#117>", line 1, in <module>
    num3.add(8)
AttributeError: 'frozenset' object has no attribute 'add'

抛出异常

Traceback (most recent call last):
  File "<pyshell#117>", line 1, in <module>
    num3.add(8)
AttributeError: 'frozenset' object has no attribute 'add'

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值