认识算法的重要性

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

最新文章

  1. Ubuntu安装c++编译器
  2. 日志系统实战(二)-AOP动态获取运行时数据
  3. Android开发资源获取国内代理(转载)
  4. MAC OS上Nginx安装
  5. Jquery点击发送按钮后,按钮文本倒计时
  6. C# typeof()实例详解
  7. C++ Tempatet之模板模型
  8. NOIP2014 飞扬的小鸟
  9. c#接口深入一步探究其作用,适合新人了解
  10. HTTP学习笔记5-常用报头
  11. poj3579 二分搜索+二分查找
  12. intent传对象
  13. 模块化与MVC
  14. SharePoint 2013 配置InfoPath 列表表单
  15. 在Storyboard中为UITableView添加Header和Footer
  16. codeforces1152 div2
  17. Codeforces 1107 E - Vasya and Binary String
  18. CSS之定位,relative/absolute/fixed的用法
  19. 分布式 session
  20. Georgia Tech Online Master of Science in Computer Science 项目经验分享

热门文章

  1. [原]Jenkins(七)---jenkins项目编译测试发布由maven构建的web项目
  2. 【JavaScript】--- ES6/ES7/ES8
  3. SPRING的事务配置详解
  4. 洛谷P1029 最小公约数和最大公倍数问题【数论】
  5. CodeForces 1099E - Nice table - [好题]
  6. URL编码问题
  7. [dpdk][kernel][driver] 如何让DPDK的UIO开机自动加载到正确的网卡上
  8. python fabric实现远程操作和部署示例
  9. elasticsearch最大的条件数设置
  10. selenium+iframe 如何定位元素(实战)