认识算法的重要性

- 遇到问题? 学完语言,接到需求,没思路?
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))

[py]软件编程知识骨架+py常见数据结构的更多相关文章

  1. python解无忧公主的数学时间编程题001.py

    python解无忧公主的数学时间编程题001.py """ python解无忧公主的数学时间编程题001.py http://mp.weixin.qq.com/s?__b ...

  2. 8种常见数据结构及其Javascript实现

    摘要: 面试常问的知识点啊... 原文:常见数据结构和Javascript实现总结 作者:MudOnTire Fundebug经授权转载,版权归原作者所有. 做前端的同学不少都是自学成才或者半路出家, ...

  3. 中兴软件编程规范C/C++

    Q/ZX 深圳市中兴通讯股份有限公司企业标准 (设计技术标准) Q/ZX 04.302.1–2003      软件编程规范C/C++                               20 ...

  4. PHP面试(二):程序设计、框架基础知识、算法与数据结构、高并发解决方案类

    一.程序设计 1.设计功能系统——数据表设计.数据表创建语句.连接数据库的方式.编码能力 二.框架基础知识 1.MVC框架基本原理——原理.常见框架.单一入口的工作原理.模板引擎的理解 2.常见框架的 ...

  5. 转 Python常见数据结构整理

    http://www.cnblogs.com/jeffwongishandsome/archive/2012/08/05/2623660.html Python常见数据结构整理 Python中常见的数 ...

  6. 数据结构和算法(Golang实现)(11)常见数据结构-前言

    常见数据结构及算法 数据结构主要用来组织数据,也作为数据的容器,载体. 各种各样的算法,都需要使用一定的数据结构来组织数据. 常见的典型数据结构有: 链表 栈和队列 树 图 上述可以延伸出各种各样的术 ...

  7. 数据结构和算法(Golang实现)(12)常见数据结构-链表

    链表 讲数据结构就离不开讲链表.因为数据结构是用来组织数据的,如何将一个数据关联到另外一个数据呢?链表可以将数据和数据之间关联起来,从一个数据指向另外一个数据. 一.链表 定义: 链表由一个个数据节点 ...

  8. 常见数据结构之JavaScript实现

    常见数据结构之JavaScript实现 随着前端技术的不断发展,投入到前端开发的人数也越来越多,招聘的前端职位也越来越火,大有前几年iOS开发那阵热潮.早两年,前端找工作很少问到关于数据结构和算法的, ...

  9. IM软件业务知识—导航

    ----------------------------------------------------欢迎查看IM软件业务知识<专栏>-------------------------- ...

随机推荐

  1. 【SpringCloud微服务实战学习系列】服务治理Spring Cloud Eureka

    Spring Cloud Eureka是Spring Cloud Netflix微服务中的一部分,它基于NetFlix Sureka做了二次封装,主要负责完成微服务架构中的服务治理功能. 一.服务治理 ...

  2. StrokesPlus 谷歌搜索结果转https

    StrokesPlus 谷歌搜索结果转https 亲测ie11可用 --清空剪切板 acSetClipboardText('') acSendKeys("^l") --选中地址栏 ...

  3. Cordova 微信分享插件,安卓亲测可用

    Cordova 微信分享插件,安卓亲测可用,收藏 https://github.com/vilic/cordova-plugin-wechat

  4. C - Boxes in a Line 数组模拟链表

    You have n boxes in a line on the table numbered 1 . . . n from left to right. Your task is to simul ...

  5. Maven本地库_remote.repositories文件

    本地库中的包都有一个_remote.repositories文件,示例: #NOTE: This is an Aether internal implementation file, its form ...

  6. 打造研发效率核心竞争力!第40届MPD软件工作坊北京站议题公开

    同样是做研发,为什么你的效率总是提不上来?都在寻找创新的技术领域,为何别人总能抢占先机?提升自己的研发竞争力,你都有什么方法? 研发效能已经成为软件企业发展非常核心的竞争力.身处在高速发展的软件研发行 ...

  7. 鸡头兔头共20,脚56,鸡兔各有多少?算法实 php现版

    //$x 鸡头 //$y 兔头 for ($x = 0; $x <= 20; $x++) { for ($y = 0; $y <= 20; $y++) { if (($x + $y == ...

  8. .NET Core开发日志——从ASP.NET Core Module到KestrelServer

    ASP.NET Core程序现在变得如同控制台(Console)程序一般,同样通过Main方法启动整个应用.而Main方法要做的事情很简单,创建一个WebHostBuilder类,调用其Build方法 ...

  9. HQL之动态分区调整

    动态分区插入可以基于查询语句分出出要插入的分区名称.比如,下面向分区表插入数据的SQL: insert into table chavin.emp_pat partition(dname,loc) s ...

  10. day14: 生成器进阶

    1,复习,迭代器:双下方法很少直接调用,一般都是通过其他语法触发的:迭代器一定可迭代,可迭代的通过调用iter()方法皆可以得到一个迭代器. 迭代器很方便使用,所有的数据只可以取一次,节省内存空间.生 ...