python学习(二)

2 篇文章 0 订阅
1 篇文章 0 订阅

(一)列表(打了激素的数组)
1. 定义列表
li = [1, 1.0, “westos”, (1,2,3,4), [1,2,3,4]]

2.定义元组
t = (1, 1.0, “westos”, (1,2,3,4), [1,2,3,4])
元组是不可变数据类型,不能修改元素;
t[0] = 11 ##不可以
列表是可变数据类型,可以修改元素;

3 列表的特性(与元组对比)
一 列表特性
1)索引
正向索引
li[0]
反向索引
li[-1]
拿出列表最后一个元素, 最后一个元素是列表, 再拿出列表的第三个元素,如下 :
li[-1][2]
2)切片
去掉列表的第一个元素
li[1:]
逆序显示
li[::-1]
3)重复, 连接
li * 2
不建议这样连接两个列表,后面有效率更高的方法 :
li1 = [“westos”, “new year”]
li+li1
4)成员操作符
print 13 in li
print 13 not in li

True
False

二 列表的增删改查
增 :
ip 白名单
1)追加元素到列表的最后:
allow_ip = [“172.25.254.1”,”172.25.254.3”, “172.25.254.26” ]
1)
allow_ip.append(“172.25.254.250”)
2)增加元素到列表的指定位置:
allow_ip.insert(0, “192.168.1.253”)

iterable 代表可迭代的;

目前学习的可迭代对象有 : str, list, tuple

print “增加多个元素到列表最后:”
allow_ip.extend([“172.25.254.45”, “172.25.56.21”])

改:
通过列表的索引,对列表某个索引值重新赋值;
allow_ip[0] = “192.168.1.1”

buy = [“apple”, “computer”,”apple”]
统计某个元素在列表中出现的次数 ;
print buy.count(“apple”)
找到某个值在列表中的索引值
print buy.index(“computer”)
2
1

删:
1)buy.remove(“apple”)
2) 删除列表中第 i 个索引值;
del buy[0]
print buy
删除除了第一个元素之外的其他索引值
del buy[1:]
删除列表对象
del buy
3)删除指定索引对应的值,默认是最后一个元素 ;
li.pop()
print li
删除列表的第一个索引 ;
li.pop(0)
三 其他的排序及逆转
1)排序,如果说都是数字,按照数字大小排序 ;

是字母的话,按照 ASCII 码来排序;

** 如何查看对应的 ASCII 码 ? ord(‘a’)

li = [12, 34, 56, 8]
li.sort()
print li

2)逆转; li[::-1]
li.reverse()
print li

四 列表练习
1)用户登录程序版本2:
用户名和密码分别保存在列表中;
用户登录时,判断该用户是否注册;
用户登录时,为防止黑客暴力破解, 仅有三次机会;
如果登录成功,显示登录成功(exit(), break).
知识点学习:
python中特有的while….else…语句
如果满足while后面的语句,执行while循环的程序, 如果不满足,执行else里面的程序.
提示: 用户名和密码一一对应

2)列表构建栈和队列数据结构
栈是先进后出(LIFO-first in last out);
类似于往箱子里面放书;
代码实现如下: (实际应用中这样太麻烦,将来会用类实现)

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

3)列表内置方法
cmp
min, max
zip
enumerate

4)
卡号由 6 位组成, 前 3 位是 610 , 后面的依次是 001, 002, 003…100
cardids = []
for i in range(1, 101): # i = 1, 2, 3, 4…100
a = “610%.3d” %(i) # a= 610001, 610002, 610003, ….610100
cardids.append(a)

cardids 是列表

卡号显示,每 10 个卡号换行显示;

for i, j in enumerate(cardids):
    if i%10==0:
    print
    print j,

(二)字典(dict)
字典创建
1)赋值创建字典
2)通过工厂函数创建字典

赋值创建字典 , key-value , 键值对


d = {"key1":"value1", "key2":"value2"}
    print d
{'key2': 'value2', 'key1': 'value1'}
In [2]:
services = {"ssh":22, "ftp":[20,21], "http":[80, 8080]}
    print services
{'ftp': [20, 21], 'http': [80, 8080], 'ssh': 22}

通过工厂函数创建字典

userinfo = dict(user1="123", user2="456", user3 ="789")
    print userinfo
{'user2': '456', 'user3': '789', 'user1': '123'}

通过字典的 fromkeys 方法创建字典,所有元素有一个默认值;

如果没有指定默认值,默认为 None;


print {}.fromkeys("hello")

给每个元素设置默认值为 “123”;

print {}.fromkeys(["user1", "user2", "user3"], "123")
{'h': None, 'e': None, 'l': None, 'o': None}
{'user2': '123', 'user3': '123', 'user1': '123'}

应用案例: 生成多个银行卡号,并初始化密码为”000000”

卡号由 6 位组成, 前 3 位是 610 , 后面的依次是 001, 002, 003…100


cardids = []
for i in range(1, 101): # i = 1, 2, 3, 4...100
    a = "610%.3d" %(i) # a= 610001, 610002, 610003, ....610100
    cardids.append(a)
 print cardids

cardids 是列表

print {}.fromkeys(cardids, "000000")
{'610089': '000000', '610088': '000000', '610085': '000000', '610
084': '000000', '610087': '000000', '610086': '000000', '610081':
'000000', '610080': '000000', '610083': '000000', '610082': '0000
00', '610005': '000000', '610004': '000000', '610007': '000000',
'610006': '000000', '610001': '000000', '610003': '000000', '610
002': '000000', '610100': '000000', '610009': '000000', '610008':
'000000', '610030': '000000', '610031': '000000', '610032': '0000
00', '610033': '000000', '610034': '000000', '610035': '000000',
'610036': '000000', '610037': '000000', '610038': '000000', '610
039': '000000', '610029': '000000', '610028': '000000', '610027':
'000000', '610026': '000000', '610025': '000000', '610024': '0000
00', '610023': '000000', '610022': '000000', '610021': '000000',
'610020': '000000', '610058': '000000', '610059': '000000', '610
052': '000000', '610053': '000000', '610050': '000000', '610051':
'000000', '610056': '000000', '610057': '000000', '610054': '0000
00', '610055': '000000', '610049': '000000', '610048': '000000',
'610041': '000000', '610040': '000000', '610043': '000000', '610
042': '000000', '610045': '000000', '610044': '000000', '610047':
'000000', '610046': '000000', '610074': '000000', '610075': '0000
00', '610076': '000000', '610077': '000000', '610070': '000000',
'610071': '000000', '610072': '000000', '610073': '000000', '610
078': '000000', '610079': '000000', '610063': '000000', '610062':
'000000', '610061': '000000', '610060': '000000', '610067': '0000
00', '610066': '000000', '610065': '000000', '610064': '000000',
'610069': '000000', '610068': '000000', '610098': '000000', '610
099': '000000', '610096': '000000', '610097': '000000', '610094':
'000000', '610095': '000000', '610092': '000000', '610093': '0000
00', '610090': '000000', '610091': '000000', '610016': '000000',
'610017': '000000', '610014': '000000', '610015': '000000', '610
012': '000000', '610013': '000000', '610010': '000000', '610011':
'000000', '610018': '000000', '610019': '000000'}

(三)字典的特性(跟元组和列表比较)
1)字典不能索引和切片,因为字典是无序的数据类型;
2)字典不支持重复和连接;
3)字典支持成员操作符: 判断字典的key值是否在字典中存在; in, not in字典的增删改查
(1)增

字典名[key] = value
d.update(a=1, b=2)
d.update({'a':1, 'b',2})
d.setdefault('a', 1)

** 重点: setdefault 和 update方法的不同`


services = {"ftp":[20,21]}

通过字典名 [key]=value, 将 key-value 添加到字典中 ;


services['http'] = [80, 8080]
    print services
{'ftp': [20, 21], 'http': [80, 8080]}

update 方法实现添加: key 存在,覆盖 value 值, 否则,添加

services = {"ftp":[20,21]}
services1 = {'http':[80,8080]}
 services.update(services1)
     print services
 更建议使用

services.update(http=[80,8080], ftp=22)
    print services
{'ftp': 22, 'http': [80, 8080]}In [38]:

setdefault 实现添加: key 存在,不覆盖 value 值, 否则,添加

services = {"ftp":[20,21]}
services1 = {'http':[80,8080]}
services.setdefault("ftp", 22)
    print services
{'ftp': [20, 21]}

(2)改
字典名[key]=value

d.update({'a':2, 'b':3})
d.update(a=2, b=3)

(3)查
查看key值;
查看value值;
查看key-value键值对;
查看key是否存在;

services = {'ftp': 22, 'http': [80, 8080]}

查看 key 值

services.keys()
services.viewkeys()
services.iterkeys()

给 key 起名字

查看 value 值

services.values()

查看 key-value 键值对

services.items()
[('ftp', 22), ('http', [80, 8080])]In [54]:

查看 key 是否存在 ;


services.has_key('ftpp')

查看指定 key 对应的 value 值;如果 key 不存在,不报错; 如果存在,返回 value 值;

services[‘ftp’] 如果 key 不存在,直接报错;

services.get('ftpp')

(4)删

d.pop(key)
d.popitem()
del d[key]
d.clear()

删除指定 key 的字典元素;
随机删除字典的 key-value 元素 ;
删除指定 key 的字典元素;
清空字典元素
(5)循环遍历字典

for i,j in services.items():
    print i,j
ftp 22
http [80, 8080]
# 默认情况下遍历字典的 key 值;
for i in services:
    print i
ftp
http

(六)字典应用
应用1: 通过字典实现case语句
目前python不支持case语句;
实现case语句的两种方式:
if…elif…elif…else…

# if...elif...elif...else... 实现:
#coding:utf-8
"""
# 实现四则运算
- 用户分别输入第一个数字,运算操作符,第三个数字;
- 根据用户的运算操作打印出运算结果;
"""
from __future__ import division
num1 = input()
ope = raw_input()
num2 = input()
# case 语句
if ope == "+":
    print num1+num2
elif ope == "-":
    print num1-num2
elif ope == "*":
    print num1*num2
elif ope == "/":
    print num1/num2
else:
    print "error operator"In [ ]:
# 字典实现 case 语句
#coding:utf-8
"""
# 实现四则运算
- 用户分别输入第一个数字,运算操作符,第三个数字;
- 根据用户的运算操作打印出运算结果;
"""
from __future__ import division
num1 = input()
ope = raw_input()
num2 = input()
d = {
    "+":num1+num2,
    "-":num1-num2,
    "*":num1*num2,
    "/":num1/num2,
}
if not ope in d:
    print "error operator"
else:
    print d[ope]

应用2:用户管理系统
1.注册新用户
如果注册用户已经存在,则报错;
需要填写信息: name, passwd, gender, email,age;
2.用户登录 要求同之前写的用户登录系统
3.注销用户 用户注销时,需要输入用户名和正确的用户密码
4.显示用户信息 显示系统中存在所有已经注册用户的信息;
5.退出系统

#!/usr/bin/python
  2 #coding:utf-8
  3 
  4 NOTICE="""
  5     用户管理系统题目:
  6     1.注册新用户
  7         如果注册用户已经存在,则报错;
  8         需要填写信息: name, passwd, gender, email,age;
  9     2.用户登录 要求同之前写的用户登录系统
 10     3.注销用户 用户注销时,需要输入用户名和正确的用户密码
 11     4.显示用户信息 显示系统中存在所有已经注册用户的信息;
 12     5.退出系统
 13 
 14 ########################用户管理系统######################
 15 选项:
 16     1 注册
 17     2 登陆
 18     3 注销
 19     4 显示用户信息
##########################################################
 23 
 24 请输入你的选择:"""
 25 
 26 
 27 
 28 users={
 29     "user1":["westos",2,"none",24],"nb":["666",1,"none",23]
 30 }
 31 while 1:
 32     choice=raw_input(NOTICE).strip()
 33     if choice=="1":
 34         print "注册新用户".center(50,'@')
 35         name=raw_input("please your new name:")
if name in  users:
 37             print "已注册!"
 38         passwd=raw_input("please your passwd for your user:")
 39         gender=raw_input("please input gender:")
 40         email=raw_input("please input your email:")
 41         age=raw_input("please input your age:")
 42         newinfo={name:[passwd,gender,email,age]}
 43         users.update(newinfo)
 44     elif choice=="2":
 45         print "用户登录".center(50,"@")
 46         count=0
 47         while count<3:
 48             name=raw_input("please input your username:")
 49             if not name in users:
 50                 print "no such user!"
 51                 count+=1
 52             passwd=raw_input("please input your password:")
 53             if passwd ==users[name][0]:
 54                 print "login successfully!"
 55                 break
 56             else:
 57                 print "密码不对!"
 58                 count+=1
 59     elif choice=="3":
 60         count=0
 61         while count<3:
 62             name=raw_input("please input your removing name:")
 63             if name in users:
 64                 passwd=raw_input("please your password:")
 65                 if passwd==users[name][0]:
 66                     users.pop(name)
 67                     print "用户已注销!"
 68                     break
 69                 else:
 70                     print "please your right password!"
 71                     count +=1
 72 
 73     elif choice =="4":
 74         print '显示用户信息'.center(50,'@')
 75         print users
 76     elif choice =="5":
 77         exit()
 78     else:
 79         print "please input right choice!"

练习题:
1.字符串最后一个单词的长度

题目描述:计算字符串最后一个单词的长度,单词以空格隔开。

输入描述: 一行字符串,非空,长度小于5000。
输出描述: 整数N,最后一个单词的长度。

示例1:
输入:hello world
输出:5

这里写图片描述

2. 计算字符个数

题目描述: 写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。

输入描述: 输入一个有字母和数字以及空格组成的字符串,和一个字符。
输出描述:输出输入字符串中含有该字符的个数。

示例1:
输入:ABCDEF A
输出:1
这里写图片描述

3. 简单密码破解

题目描述:密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。哇哈哈. 接下来渊子要在密码之上再加一套密码,虽然简单但也安全。

假设渊子原来一个BBS上的密码为zvbo9441987,为了方便记忆,他通过一种算法把这个密码变换成YUANzhi1987,这个密码是他的名字和出生年份,怎么忘都忘不了,而且可以明目张胆地放在显眼的地方而不被别人知道真正的密码。

他是这么变换的,大家都知道手机上的字母: 1–1, abc–2, def–3, ghi–4, jkl–5, mno–6, pqrs–7, tuv–8 wxyz–9, 0–0,就这么简单,渊子把密码中出现的小写字母都变成对应的数字,数字和其他的符号都不做变换,

声明:密码中没有空格,而密码中出现的大写字母则变成小写之后往后移一位,如:X,先变成小写,再往后移一位,不就是y了嘛,简单吧。记住,z往后移是a哦。

输入描述:输入包括多个测试数据。输入是一个明文,密码长度不超过100个字符,输入直到文件结尾;
输出描述:输出渊子真正的密文

示例1:
输入:YUANzhi1987
输出:zvbo9441987

#!/usr/bin/env python
#coding:utf-8

p = raw_input("明文密码:")

for i in p :
    if i == "a" or i == "b" or i == "c" :
        p = p.replace(i,"2")
    elif i == "d" or i == "e" or i == "f" :
        p = p.replace(i,"3")
    elif i == "g" or i == "h" or i == "i" :
        p = p.replace(i,"4")
    elif i == "j" or i == "k" or i == "l" :
        p = p.replace(i,"5")
    elif i == "m" or i == "n" or i == "o" :
        p = p.replace(i,"6")
    elif i == "p" or i == "q" or i == "r" or i == "s" :
        p = p.replace(i,"7")
    elif i == "t" or i == "u" or i == "v" :
        p = p.replace(i,"8")
    elif i == "w" or i == "x" or i == "y" or i == "z" :
        p = p.replace(i,"9")

p = p.lower()
x =['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','a']
for i in p :
    if i in x :
        p = p.replace(i,x[x.index(i)+1]) 

print "暗文密码:%s" %p

4. (2017-腾讯-在线编程题)

  • 题目描述:

给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输
入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))

  • 输入描述:
    输入包括一个整数n,(3 ≤ n < 1000)

  • 输出描述:
    输出对数

  • 示例1 :

“`
输入:
10
输出:
2
这里写图片描述

这里写图片描述

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值