认识算法的重要性
- 遇到问题? 学完语言,接到需求,没思路?
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异常小结
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))