[py]软件编程知识骨架+py常见数据结构

认识算法的重要性

- 遇到问题? 学完语言,接到需求,没思路?
1.学会了语言,能读懂别人的代码, 但是自己没解决问题的能力,不能够把实际问题转换为代码,自己写出来.(这是只是学会一门语言的后果),不要成为语言的英雄. 最主要是能用语言解决问题.
2.计算机这东西容易忘,需要每天把自己的思维活动睡前回顾下.
3.不要直接开敲代码,先抛开语言,用大脑想想人应该去怎么解决这个问题,想清楚解决办法后(伪代码), 再开始写代码

4.不要以学会python为最终目的,要学会用python解决实际问题作为最终目的.(先想清楚处理过程,在翻译成py语言)


- 关于逻辑思维培养
严蔚敏的数据结构(排序 查找 列表 堆栈 队列 树的简单部分)


- 什么是算法?(处理问题的思路)
1+1 也是算法
当来一个问题时候,开发首先想用什么办法来一步步处理解决这个业务问题,最后落实到代码.可见写代码脑海中先得得到解决问题的办法,然后用编程语言来描述出来.

算法是描述解决问题的方法。

算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。

- 核心课程介绍
硬件: 组成原理

软件: 数据结构与算法核心课程 +  (深化)操作系统
         严蔚敏的数据结构(排序 查找 列表 堆栈 队列 树的简单部分)

软件专业知识骨架

- 基本素质
算法
    冒泡 快排
数据结构
    list dict(hash表) 链表
网络
    tcp三次握手 http常见状态 header
操作系统
--
    == 具体语言


复杂度: 为了评定算法之间对比的优劣. 执行完算法所用的次数. 数组有n项,复杂度就是n*n
    时间复杂度(执行完算法所需的时间,一般说的复杂度是指这个)
    空间复杂度

冒泡排序 
    复杂度O(n^2)
    稳定性: 冒泡是稳定的

语言对比

语言 优点 缺点
C/C++ 性能,游戏,底层 代码量大,上手难
java 明星级语言,比较成熟 不太好上手,代码量大,开发速度慢
.net/c# x 过时了
shell 简单的系统维护 不能算是一门编程语言,shell太简单,不能完成复杂的功能
php 易学,脚本 主要适合web
python 易学,脚本,功能强大 运行速度比java慢
javascript 易学,前端 前端脚本语言

学代码正确姿势

千万不要一开始就纠结一个模块或语法的细节方方面面,力求搞透. 一定要先会用常用几个简单功能,解决当前问题,达到一定境界后期逐步补充

1.找一些简单教程,如10min学会python等(不要太多) 2.动手敲代码(比第1步重要太多, 第2步没做,第1步做的再多也没用)

编码习惯

  • 嵌套不要超过三层(缩进)
  • 一条语句不要太长
  • 有and需要()
  • 超过2个break,要优化

判断是否是闰年(能同时被100 400 或同时被100 4整除)

- 优化前
while True:
    num = raw_input("num > ")
    if (int(num)%100 == 0 and int(num)%400==0):
        print num
        break
#    elif int(num)%100 == 0 and int(num)%4==0:
    elif int(num)%100 == 0:
        print num
        break
    else:
        print '不是闰年!!!'

- 优化后(1,前面层层都break,后面没必要写else关键字 2,多条break需要考虑重复优化问题 3,能被100整除的肯定能被4整除)
while True:
    num = raw_input("num > ")
    if (int(num)%100 == 0 and int(num)%400==0) or (int(num)%100 == 0) :
        print num
        break
    print '不是闰年!!!'

学习python的目标

学py暂时目标

  • python的基础,掌握基本的编程思想,具体两个任务
    • access_log日式处理
    • url,ip,访问状态维度,统计访问次数
    • 排序,打印出访问次数最多的前10
  • 简单的cmdb
    • 基于flask
    • 数据库mysql
    • 前端jquery+bootstrap
    • 简单粗暴的完成最简单的增删改查

远程目标

  • 1,webqq

  • 2,bbs-抽屉

  • 3,ftp

  • 4.cmdb

  • 5.商城

  • 6.新浪微博

  • 通讯录

  • 信用卡

  • 打飞机

py语言常见数据结构

- py语言
变量
  print 'maotai'
  x = 23
  print x
  

语句
python数据结构:
    数字
        四则运算
            整除:默认去尾,5%2
            取余
                table隔行换色
                负载均衡
    字符串
        单双引号
        字符串里有单/双引号:转义 'i\'m maotai'
        三个引号 里面字符串原样输出
        字符串相加(拼接) 乘法: 'maotai'*20
        字符串格式化
            + 不适用于不同类型的,可读性差(sql语句,url请求拼接)
            %s 适用于大多数
    布尔
        true false
        and or ! (if判断)
    list
    dict
    tuple

逻辑控制
    if语句
循环

if for常见应用

- 登录小程序
import getpass
username=raw_input('username: ')
password=getpass.getpass('password: ')

if username=='bob' and password=='123456':
    print 'login suceess!!!'
else:
    print 'failed'


- 打印成绩
grade=int(raw_input('input your grade>  '))

if grade>=90:
    print '优秀'
elif grade>=80:
    print '好'
elif grade>=70:
    print '良'
elif grade>=60:
    print '及格'
else:
    print '你要努力了!'


- 猜字游戏
import random

ch_list = {
    0: '石头',
    1: '剪刀',
    2: '布'
}

# menu
op = '''
0, 选石头
1, 选剪刀
2, 选布
请选一项(0/1/2) > '''
pc_op = random.choice([0, 1, 2])
# people_op = int(raw_input(op))
while True:
    people_op = int(raw_input(op))
    if people_op in [0, 1, 2]:
        break

# print result
print '''
你选的是:   %s
电脑选的是: %s
''' % (ch_list.get(people_op), ch_list.get(pc_op))

win_list = [[1, 0], [2, 0], [2, 1]]

if [people_op, pc_op] in win_list:
    print '恭喜你,你赢了.'
elif people_op == pc_op:
    print '平局!'
else:
    print '电脑赢了!'


列表知识点

list:
- in len max min del
- 切片
- append count extend index insert pop remove reverse

列表 字符串常见

- len in的实现
- 遍历列表
for x  in list
    print x

for i, element in enumerate(list):  # for循环将列表中的元素及他们的下标
    print i,element  


- 字符串--列表转换
join split

".".join(["192","168","1","10"])

'192.168.1.10'.split('.')


- 字符串拼接
fields = ["id","name","age","email"]  # 将要输出列定义到列表中,每次变动只需要修改列表就行
sql = "select %s from user" % ",".join(fields)



- todolist
todo_list = []
while True:
    action = raw_input("add|do > ")
    if action == 'add':
        oper = raw_input("oper > ")
        todo_list.append(oper)
    elif action == "do":
        if len(todo_list):
            print todo_list.pop(0)
        else:
            print "nothing"
    else:
        break

字典常用应用

- 栗子1: 字典程序调用设计: 实现switch
  功能: 程序运行打印菜单,依据不同选项菜单实现不同功能-类似switch语句
  知识点: 1. d.get(k), 有k则取出k,无k则返回none.   2. d.get(k,'hi') 有k则取出k对应的v,无k则输出hi.


def menu():
    print '''
    0: exit
    1: add
    2: del
    3: update
    4: search    
    '''
    op = raw_input("pls input your op > ")
    return op

def txl_add():
    print "adding"

def txl_exit():
    print 'good bye'
    import os
    os._exit(0)

d = {
    0: txl_exit,
    1: txl_add,
}

while True:
    op = menu()
    d.get(op,txl_exit)()




- 字典传值-格式化字符串
stu={
    'name':'maotai',
    'age':22
}  
print "%(name)s %(age)d"%(stu) 




-  10以内的加法训练器, 每次生成一个10以内加法,让你计算结果
from operator import add, sub
from random import choice, randint

ops = {'+': add, '-': sub}


def doprob():
    '''生成算数题目'''
    op = choice("+-")
    nums = [randint(1, 10) for i in range(2)]
    nums.sort(reverse=True)
    ans = ops.get(op)(*nums)
    pr = '%d %s %d= ' % (nums[0], op, nums[1])

    num = 0
    while True:
        try:
            if (int(input(pr))) == ans:
                print("correct!")
                break
            if num == 2:
                print("the ans is %s %d" % (pr, ans))
            else:
                print("increct,try again!")
                num += 1
        except(KeyboardInterrupt, EOFError, ValueError):
            print("invalid input ,try again!")


def main():
    while True:
        doprob()
        try:
            opt = input("Again?[y]").lower()
            if opt and opt[0] == "n":
                break
        except(KeyboardInterrupt, EOFError):
            break


if __name__ == '__main__':
    main()

体验python能干嘛

求两个数的平均值,如果输入为空,则继续输

x = raw_input('x: num > ')

while not x:
    x = raw_input("x: num !!!! > ")

y = raw_input('y: num > ')
while not y:
    y = raw_input("y: num !!!! > ")

print (int(x) + int(y)) / 2.0

用户输入字符,如果输入为0,打印所有数字和,后退出

total = 0
n = raw_input("input a num > ")

# 确保n不等于0,才执行
while n != "0":
    total = total + int(n)
    n = raw_input("input a num >!!!!! ")
print total

不停输入数字,当遇到0时,输入平均数,并退出

count = 1
total = 0

num = input("input a num > ")
while num != 0:
    count += 1
    total += num
    num = input("input a num >!!!!!!!!! ")
print count
print total*1.0 / (count - 1)

存10000块钱,年利率3.25%,多少年后能翻一番

year = 0
total_money = 10000

while total_money <= 20000:
    year += 1
    total_money += total_money * 0.0325
    print "year is %s; total_money is %s" % (year, total_money)
print "--" * 10
print year

统计js关键字在列表中出现的次数

alist = ['js', 'C', 'java', 'js', 'py']

count = 0
for i in alist:
    if i == "js":
        count += 1

print count

求列表中最大值

alist = [1,9999, 10, 100, 9, 1000]

# 假设法
max_num = 0
for i in alist:
    if i > max_num:
        max_num = i
print max_num

# 思路2: 先排序,后取出

alist = ['C','js', 'C', 'java', 'js', 'py']

for i in alist:
    print i
    if i == "js":
        continue

判断是否是闰年(能同时被100 400)

#优化前
# while True:
#     num = raw_input("num > ")
#     if (int(num)%100 == 0 and int(num)%400==0):
#         print num
#         break
# #    elif int(num)%100 == 0 and int(num)%4==0:
#     elif int(num)%100 == 0:
#         print num
#         break
#     else:
#         print '不是闰年!!!'

# 优化后
while True:
    num = raw_input("num > ")
    if (int(num)%100 == 0 and int(num)%400==0) or (int(num)%100 == 0) :
        print num
        break
    print '不是闰年!!!'

(数据统计)统计列表中每项出现的次数

dict 增加 修改

数据统计的思路都差不多

首先思路是: 初始化一个字典,然后依次遍历初始化字典的value(个数)
d = {}
arr = ['js', 'py', 'django', 'django', 'py', 'py']

# for i in xk:
#     if not d.has_key(i):
#         d[i]=0

# for i in xk:
#     if d.has_key(i):
#         d[i]+=1

## 数据统计的一个
for i in arr:
    if i in d:
        d[i] += 1
    else:
        d[i] = 0
print d

求列表中top 2 num

  • 思路1: 两次循环,分别找出最大的,第二次循环max_num != sec_num
  • 思路2: 两次循环,分别记录最大值位置点, 第二次循环 max_index != sec_index
  • 思路3: |__|_______ 落在期间,num > max_num时,sec_num=max_num, max_num=num
arr = [1, 2, 3, 2, 12, 3, 1, 3, 21, 2, 2, 3, 4111, 22, 3333, 444, 111, 4, 5, 777, 65555, 65555, 45, 33, 45]

# 思路1: 直接比值(存在缺陷: 相同的2个最大值时)
'''
max_num = 0
sec_num = 0

for i in arr:
    if i > max_num:
        max_num = i
print max_num

for i in arr:
    if i > sec_num and i != max_num:
        sec_num = i
print sec_num
'''

# 思路2: 找出最大的,记下它的位置,再找出次大的(不能和最大的为止一致)
'''
max_num = 0
max_index = 0
sec_num = 0

i = 0
for num in arr:
    if num > max_num:
        max_num = num
        max_index = i
    i += 1
print max_index, max_num
#####################
j = 0
sec_index = 0
for num in arr:
    j += 1
    if num > sec_num:
        sec_num = num
        sec_index = i
print sec_index,sec_num
'''

# 思路3: 定义2个变量, 看num落在哪个范围
# ______|________|_______

max_num = 0
sec_num = 0

for num in arr:
    if num < sec_num:
        pass
    elif sec_num < num and num < max_num:
        sec_num = num
    elif num >= max_num:
        sec_num = max_num
        max_num = num

print max_num, sec_num

python异常小结

py异常应用

IndentationError 缩进错误
NameError  调用未定义的

ValueError 转换错误
TypeError  函数没传参数
AttributeError 调用类中不存在的属性


RuntimeError: 递归栈溢出,maximum recursion depth exceeded in comparison


StopIteration 生成器生成的列表,next到了最后一个以外.
g = (x*x for x in range(3))
# for n in g:
#     print(n)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
posted @ 2018-01-05 20:08  mmaotai  阅读(346)  评论(0编辑  收藏  举报