老男孩 - python基础day1

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

基础知识

%s 字符串格式输出,%d 数字格式化输出

可变类型(mutable):列表,字典,集合 不可变类型(unmutable):数字,字符串,元组

有序数据 : 列表,元组 无序数据 : 结合

s为字符串判断

s.isalnum() 所有字符都是数字或者字母
s.isalpha() 所有字符都是字母
s.isdigit() 所有字符都是数字
s.islower() 所有字符都是小写
s.isupper() 所有字符都是大写
s.istitle() 所有单词都是首字母大写,像标题
s.isspace() 所有字符都是空白字符、\t、\n、\r
# True or False

列表

1、有序的集合 2、通过偏移来索引,从而读取数据 3、支持嵌套 4、可变的类型

基础

l = []
l =[‘张三‘,‘李四’,'alex']
# 创建

l.append("eva")
# 追加

# 删除
l.remove('eva')
l.pop() # 删除最后一个


索引

l = ['egon','alex','seven','yuan']
l[0]

切片

切片后是新的列表

l = ['egon','alex','seven','yuan']
l[0:3]
# 1-3 之间的元素
l[2:]
# 第3个开始的元素
l[:]
# 切片
l[::2]
l[::-1]

枚举打印索引

for x,y  in enumerate (lists):
    print(x,y)

列表推导式

a=[ i for i  in lists]

常用数据处理(索引、查找、分割、连接、替换、统计、大写)

find搜索

s = 'hello'
print (s.find('e'))
# 搜索到 值为1
print (s.find('i'))
# 未搜索到 值 -1

index索引

s = 'hello'
print(s[1])
# 第二位
print (s[-1])
# 最后一位
print(s.index('e'))
# 字符串索引序号
print(type(s))

len长度

len(lists)
# 字符、列表...长度

replace替换

s = 'hello,world'
s = s.replace('h','H')
print (s)

split字符串切割成列表

s = 'hello,world'
print (s.split(","))

strip清除

s = '  hello,world!  '
s.strip()   # 清除头尾两边空白
s.lstrip()  # 清理左空白
s.rstrip()  # 清理右空白
s2 = '***hello,world!***'
s2.strip('*') #清除指定内容

collections模块

namedtuple: 生成可以使用名字来访问元素内容的tuple子类 tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:

p = (1, 2)
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
p.x
# 1
p.y
# 2

deque: 双端队列,可以快速的从另外一侧追加和推出对象

from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x')
# 追加元素
q.appendleft('y')
# 左边添加元素

deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。

defaultdict: 默认字典,当引用key不存在,返回一个默认值

from collections import defaultdict
dd = defaultdict(lambda: 'N/A')
dd['key1'] = 'abc'
dd['key1']

dd['key2']

OrderedDict:保持Key的顺序

od = OrderedDict()
od['z'] = 1
od['y'] = 2
od['x'] = 3
od.keys()

hash

可变的数据类型是不可以被hash 一个值可以hash那么说明这是一个不可变得数据类型

copy

深浅拷贝的作用: 1,减少内存的使用; 2,以后在做数据的清洗、修改或者入库的时候,对原数据进行复制一份,以防数据修改之后,找不到原数据。

对于不可变对象的深浅拷贝: 不可变对象类型,没有被拷贝的说法,即便是用深拷贝,查看id的话也是一样的,如果对其重新赋值,也只是新创建一个对象,替换掉旧的而已; 一句话就是,不可变类型,不管是深拷贝还是浅拷贝,地址值和拷贝后的值都是一样的。

浅copy

alist=[1,2,3,["a","b"]]
b=alist
alist.append(5)
print (b)
#直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变
alist=[1,2,3,["a","b"]]
import copy
c=copy.copy(alist)
alist.append(5)

print (alist,c)
[1, 2, 3, ['a', 'b'], 5],[1, 2, 3, ['a', 'b']]
# copy浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变


alist[3]
alist[3].append('cccc')
print (alist,c)
# 里面的子对象被改变了

深copy

import copy
alist=[1,2,3,["a","b"]]
d=copy.deepcopy(alist)
alist[3].append("ccccc")

print (alist,d)
#  始终没有改变

字典

基础

# dic = {}
dictionary["lj"] = "18069" #或者用下面
dictionary1= {"lj":"18099"}
# 赋值

del dictionary["gd"]
# 删除key
dictionary.clear()
# 清空所有条目
dictionary = {"lj":"18099","gd":"hehehe","gg":"1199","aaa":"11"}
for key in sorted(dictionary.keys()):
    print (key,dictionary[key])
# sorted返回新副本排序keys,原数据不变

循环迭代

for k in dic.keys()
for k,v in dic.items()

for k in dic:
    print (k,dic(k))

合集

1.确定性(集合中的元素必须是确定的) 2.互异性(集合中的元素互不相同。例如:集合A={1,a},则a不能等于1) 3.无序性(集合中的元素没有先后之分),如集合{3,4,5}和{3,5,4}算作同一个集合。

基础

list_1 = set{2,4,6,8,9}
# set 语法

list_2 = [1,3,4,6,3,5,7]
#列表
list_2 = set(list_1)
#转集合类型

print ('交集',list_1 & list_2)
#list1与list2都有的 (交集)

print ('差集',list_1 - list_2)
##list1 有 list2没的

print ('对称差集',list_1 ^ list_2)
#取两边不重复的 (对称差集)

print ('并集',list_1 | list_2)
#list1和list2合集

常用方法

s.add(x)
增加元素

s.remove(x)
# 删除元素,如果不存在则引发 KeyError

s.s.discard(x)
# "s"中存在元素 x, 则删除

s.pop()
# 删除第一个

s.clear()
# 清空元素

数据处理:

join拼接方法

lists=['alex', 'steven', 'egon']
"_".join(lists)

'alex_steven_egon

切割列表

s = 'hello,world'
s.split(',')

['hello', 'world']

大小写

str.upper()
str.lower()
#字符串转大写;字符串转小写

流程控制

循环从大到小输出1 - 100

count = 101
for i in range (count):
    print(i)
print("for done")

count = 0
while count <100:
    count +=1
    print(count)

print("while done")

循环从小到大输出100 - 1

count = 101
for i in range(count,0,-1):
    print(i)
print("for done")

while count >1:
    count -=1
    print(count)
print("while done")

最大最小

li=[1, 3, 2, 7, 6, 23, 41, 243, 33, 85, 56]
max(li),min(li),sum(li)
# 最大,最小,求和

乘法表

number=1
print ("显示乘法表:")
for i in range(1,11):
    print  (number, "*",i,"=",number * i)

利用for循环和range输出9 * 9乘法表

print('\n'.join([ ' '.join([ "%d*%d=%2s" %(y,x,x*y) for y in range(1,x+1)]) for x in range(1,10)]))

在不改变列表中数据排列结构的前提下,找出以下列表中最接近最大值和最小值的平均值 的数 li = [-100,1,3,2,7,6,120,121,140,23,411,99,243,33,85,56]

编码

简述 把Unicode和UTF-8关系

1.在计算机内存中统一使用Unicode编码·,当需要保存到硬盘或需要传输时,就转换为UTF-8编码 2.用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件

编码长度

字母: 字节数 : 1;编码:GBK 字节数 : 1;编码:UTF-8

中文汉字 字节数 : 2;编码:GB2312 字节数 : 2;编码:GBK 字节数 : 3;编码:UTF-8

编码转换

unicode >  s.encode("utf-8") > s.decode("utf-8") >  unicode
#  将python3默认的Unicode字符 通过encode编码为utf-8;通过decode 解码为unicode(万国码)

bin(10),oct(10),hex(10)
# 二进制,十进制,十六进制

练习题:

查找列表中元素,移除每个元素的空格,并查找以a或A开头并且以c结尾的所有元素

li = ["alec", " aric", "Alex", "Tony", "rain"]
tu = ("alec", " aric", "Alex", "Tony", "rain")
dic = {'k1': "alex", 'k2': ' aric', "k3": "Alex", "k4": "Tony"}

文件a.txt内容:每一行内容分别为商品名字,价钱,个数,求出本次购物花费的总钱数

apple 10 3
tesla 100000 1
mac 3000 3
lenovo 30000 3
chicken 10 3
with open('a.txt','r') as f:
    info = f.read()
    f.close()

f = info.split('\n')
count = 0
for line in f:
    line = line.split()
    line_count =int( line[1]) * int (line[2])
    count += line_count
print(count)

使用 while/for循环实现输出 2-3+4-5+6...+100的和



sum = 0
count = 1
while count <100:
    count = count + 1
    if count%2 !=0:
        sum -= count
    else:
        sum += count
print("2-3+4-5+6...+100=",sum )


num=0
count = 0
for  i in range (2,101):
    count += 1
    if (count % 2) == 0:
        #print(i)
        num -= i
    else:
        num += i
print("2-3+4-5+6...+100=",num)

求100以内的素数和

N=100
i=2
num=2
s=0
for i in range(2,100):
    for num in range(2,i):
        if (i%num==0):
            break
    else:
        s+=i
        print(i)
print(s)

在不改变列表中数据排列结构的前提下,找出以下列表中最接近最大值和最小值的平均值 的数li = [-100,1,3,2,7,6,120,121,140,23,411,99,243,33,85,56]

解题思路,找到最大值 ,找到最小值 ,求平均值 ,找到列表中离这个平均值 最近的值

li = [-100,1,3,2,7,6,120,121,140,23,411,99,243,33,85,56]
max_n = max(li)
min_n = min(li)
avg_n = (max_n + min_n)/2

print("最大数",max_n,"最小数",min_n)
print("平均数",avg_n)


avg_like = 0
for i in li:
    if abs(i - avg_n) < abs(avg_like - avg_n):
        avg_like = i
print('最接近平均值 的是',avg_like)

作业

登陆

_user = 'lj'
_passwd = '123456'

count = 0
while  count <3:

    count += 1
    username = str(input("Username:")).strip()
    password = str(input("Password:")).strip()

    if username == _user and password == _passwd:
        print("%s,欢迎登陆" % username)
        break
    else:
        pass

三级菜单

menu = {
    '北京':{
        '海淀':{
            '五道口':{
                'soho':{},
                '网易':{},
                'google':{}
            },
            '中关村':{
                '爱奇艺':{},
                '汽车之家':{},
                'youku':{},
            },
            '上地':{
                '百度':{},
            },
        },
        '昌平':{
            '沙河':{
                '老男孩':{},
                '北航':{},
            },
            '天通苑':{},
            '回龙观':{},
        },
        '朝阳':{},
        '东城':{},
    },
    '上海':{},
    '山东':{},
}

current_layer = menu
layers = []

Flag = True
while Flag:

    for line in current_layer:
        print (line)

    choose_input = input('>:').strip()
    if not  choose_input: continue

    if choose_input in current_layer:

        layers.append(current_layer) # 进入下一层,保存当前层
        #print(layers)
        current_layer = current_layer[choose_input] # 当前层


    elif choose_input == "B" or choose_input == "b":
        if  len(layers) == 0:  # pop不能删空列表,会报错
            print("已经是顶层了")
        else:
            current_layer = layers.pop()

    if choose_input == "q" or choose_input == "Q":
        exit("退出")

转载于:https://my.oschina.net/attacker/blog/2986132

你可能感兴趣的:(python)