安全矩阵

 找回密码
 立即注册
搜索
查看: 15890|回复: 46

张欢学习日记

[复制链接]

9

主题

55

帖子

290

积分

中级会员

Rank: 3Rank: 3

积分
290
发表于 2020-2-17 22:00:07 | 显示全部楼层 |阅读模式
程序设计步骤:问题分析-->算法设计-->程序编写-->对源程序进行编辑、编译和连接-->运行程序,分析结果-->文档编写

程序设计分类:
1.按结构性质分类
2.按用户要求分类
3.按程序设计的成分性质分类
4.按程序设计风格分类

语言分类:
1.一代语言:机器语言
2.二代语言:汇编语言
3.三代语言:高级语言
                  结构化语言:Fortran语言  Basic语言  C语言  Pascal语言
                  面向对象语言:C++  C#  JAVA  SmallTalk

Python语言的特点:
1.跨平台和兼容性好,可以在linux,windows和macos上运行
2.自动回收内存
3.面向对象
4.具有强大的动态数据类型支持
5.易于扩展,即如果需要一段运行效率很高的关键代码或者一段需要加密的代码,可以通过c/c++编写,然后在python中调用
6.具有强大的类库支持
7.交互命令行模快能方便地进行小代码调试和学习
           
算法的基本性质
1.正确性:对于任意的一组合理或不合理的输入,总能得到预期的输出
2.可行性:算法的每一步都能被计算机理解并执行
3.确定性:算法每个步骤都有明确的顺序
4.有限性:算法必须在有限步之后结束

算法的“健壮性”:指对输入的非法数据也能作出查档反应或进行相应处理

程序修仙之路 day 1
回复

使用道具 举报

9

主题

55

帖子

290

积分

中级会员

Rank: 3Rank: 3

积分
290
 楼主| 发表于 2020-2-18 21:45:46 | 显示全部楼层
简单算法:1.由公式作为算法描述
                2.通过一次性计算解决问题
复杂算法:1.没有终极算法作为问题解法
                2.可通过反复计算逐步得到问题的解或近似解
                3.每计算一次解决问题的一部分或得到一次更好的近似解

利用辗转相除算法求最大公约数的代码:
p=252
q=105
if p<q:
    p,q=q,p
r=p%q
while r:
    p=q
    q=r
    r=p%q
print(q)

辗转相除法:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。最后的除数就是最大公约数。
应用:1.生成全世界不同文化中的传统音乐节奏
         2.RSA算法的重要组成部分
         3.现代数论的基本工具   等...

python内置数据类型
简单数据类型:整型  int
                      浮点型  float
                      复数  complex
                      布尔  bool
序列对象:字符串  str
                元组  tuple
                列表  list
其他类型:集合类型  set
                字典类型  dict

利用数学公式求三角形面积代码:
import math  #引用模块math,方便后面的开根号计算
a,b,c=3,4,5
s=(a+b+c)/2
area=math.sqrt(s*(s-a)*(s-b)*(s-c))
print(area)

静态类型化:预先指定变量的数据类型,不同类型的变量存储特定数据类型的数据,一旦数据类型确定,对应的内存字节数、编码形式和可参加的运算也被确定。
动态类型技术:变量使用前不需要声明数据类型即可使用,然后根据变量中存放的数据不同,决定其数据类型。
例如:C语言中,需要先通过int,float,double等声明数据类型,通过编译软件发出请求,之后操作系统才能给这个变量分配内存。      C语言定义变量:int i=0;
         而在python中,不需要声明变量的数据类型就可以直接使用变量。     Python定义变量:i=0

程序修仙之路 day 2
回复

使用道具 举报

9

主题

55

帖子

290

积分

中级会员

Rank: 3Rank: 3

积分
290
 楼主| 发表于 2020-2-19 21:39:36 | 显示全部楼层
0o #八进制
0b #二进制
0x #十六进制

复数类型数据complex
表示为
  real + imag(J/j后缀)
4.23+8.5j


运算符
算术运算符
  +
  -
  *
  /
%取余
  **求幂
  //取整

复合运算符
  +=
  -=
  *=
  /=
  **=  a=a**b等价于a**=b
  //=  a=a//b等价于a//=b

关系运算符
  ==
  !=
  >
  <
  >=
  <=

逻辑运算符
逻辑与and
逻辑或or
逻辑非not

位运算符(将数字转换为二进制进行运算)
  & 按位与
  | 按位或
  ^ 按位异或
  ~ 按位取反
  << 左移位
  >> 右移位


int(x)  将x转换为一个整数
float(x)  将x转换为一个浮点数
str(x)  将x转换为字符串
ord(x)  将一个字符转换为它的ASCII码值
chr(x)  将一个整数转换为字符
hex(x)  将一个整数转换为一个十六进制字符串
oct(x)  将一个整数转换为一个八进制字符串
eval(str)  将字符串str当成有效表达式来求值,并返回计算结果


模块:把常用的一些功能单独放置到一个文件中,方便其他文件来调用。这样的一个文件可以称为一个模块。
python的标准库:分为内置模块和非内置模块

内置模块:定义了一些开发中常用的函数,这些函数实现了数据类型的转换,数据的计算,序列的处理、常用字符串处理。如:
help(obj) 在线帮助, obj可是任何类型,例如查看math模块的内容help(math)
reper(obj),将任意值转为字符串,常用于构造输出字符串
round(x,n)可按“四舍五入”法对x保留n位小数
len(s)计算字符串的长度

非内置模块:以文件形式存在于python的安装目录中,程序使用前需要导入模块。如:
1.import [模块名]
   调用函数
   [模块名].[函数或字面常量]
例:
   import math
   math.pi  #查看圆周率常数
   math.pow(x,y)  #求x的y次方pow(x,y)
   
2.from [模块名] import [函数名}
   调用函数
   [函数或字面常量]
   例:
      from math import sin #引入数学库中的sqrt函数
      from math import *   #引入数学库中所有的函数

程序修仙之路 day 3
回复

使用道具 举报

9

主题

55

帖子

290

积分

中级会员

Rank: 3Rank: 3

积分
290
 楼主| 发表于 2020-2-20 22:25:09 | 显示全部楼层
字符:计算机中表示文本的最基本的单位,包括可打印字符和不可打印的控制字符。
可打印字符包括:英文的大小写字母a~z,A~Z;数字字符0~9;标点符号和一些键盘上的常见符号。

python的转义字符
\\ 反斜杠符号
\’单引号
\”双引号
\a响铃
\b退格
\e转义
\000空
\t横向制表符
\r回车
\n换行
\(在行尾时)续行符
\f换页
\oyy八进制数yy代表的字符
\xyy十六进制数yy代表的字符

字符串常量:字符串可以使用双引号或单引号封装,但前后必须一致。如果字符串本身要带引号,使用转义字符\”或\’。

字符串变量:字符串变量的实质是一个指向字符串对象的标示符。

对字符串的一些处理方法:
msg1="我生于长空,"
msg2="长于烈日"
#字符串连接
print(msg1+msg2)
#字符串重复
print(msg2*3)
#可以使用索引去获取字符串中的字符
#索引:字符串中的每一个字符都有索引
print(msg1[2])
#计算 开始结束是左闭右开(即包含左边不包含右边)
start=1
end=3
print(msg1[start:end])
#索引支持负数  负索引是从-1开始的
print(msg2[-3:-1])
#截取时,不写开始 代表从0开始,不写结束 代表到最后
print(msg2[:])

子串测试操作:子串测试操作in可以测试一个子串是否存在于一个字符串中,并返回布尔值,用法为:<子串>in<字符串>  如:’love’ in ‘love and peace’

str对象方法的调用形式:<字符串>.方法名(<参数>)
一些常用方法:
S.capitalize()  返回首字符大写后的字符串,S对象不变
S.lower()  返回所有字符改小写后的字符串,S对象不变
S.upper()  返回所有字符改大写后的字符串,S对象不变
S.strip()  返回删去前后空格后的字符串,S对象不变
S.replace(old,new)  将S对象中所有old子串用new子串代替
S.count(sub,start,end)  计算子串sub在S对象中出现的次数,start和end分别定义起始和终止位置
S.find(sub,start,end)  计算子串sub在S对象中首次出现的位置
S.join(,/.)  将序列对象中所有字符串合并成一个字符串,S对象为连接分隔符
S.split(sep=None)  将S对象按分隔符sep拆分为字符串列表,默认为空格
示例:
>>> s.find('he')  #求子串'he'第一次出现的位置
1
>>> s.count('h')  #求'h'出现的次数
2
同样,使用str类的方法同样不能改变字符串对象的值,例如调用strip函数去除字符串的前后空格,它的作用是返回一个去除了原字符串的前后空格的新串。
>>> s='   hello python   '
>>> t=s.strip()
>>> s
'   hello python   '
>>> t
'hello python'
>>> a=["hello","Python" ]
>>> b=" ".join(a)
>>> b
'hello Python'
>>> b.split()         
['hello', 'Python']
>>> c=",".join(a)
>>> c
'hello,Python'
>>> c.split(',')
['hello', 'Python']

程序修仙之路 day 4
回复

使用道具 举报

9

主题

55

帖子

290

积分

中级会员

Rank: 3Rank: 3

积分
290
 楼主| 发表于 2020-2-21 19:58:24 | 显示全部楼层
#列表创建的两种方式
l1=[1,2,3,4]
print(l1)
print(type(l1))

l2=list("abcdef")
print(l2)
m=l2[3]
print(m)

#列表中的元素 索引支持负数
n=l2[-3]
print(n)

#列表数据修改
l2[3]="xyz"
print(l2[3])
del l2[4]

#l1.append(object)  在列表尾部追加对象
l1.append(5)
print(l1)
l1.append(6)
print(l1)

#l1.extend(l3)  将l3的表扩充到l1中
l3=[5,6,7]
l1.extend(l3)
print(l1)

#l1.insert(index,object)  在列表l的下标为index的表项前插入对象
l1.insert(0,7)
print(l1)

#l1.pop([index])  弹出返回并移除下标为index的表现,默认最后一个
l1.pop()
print(l1)

#l1.remove(value)  移除第一个值为value的表项
l1.remove(2)
print(l1)

#l1.index(value,[start],[end])  计算value在列表l1指定区间第一次出现的下标值
print(l1.index(7))

#l1.reverse()  倒置列表l1
l1.reverse()
print(l1)

#l1.sort()  对列表中的数值按从低到高的顺序排序
l1.sort()
print(l1)

#l1.count(value) 计算value在列表l1中出现的次数
l1.count(2)
print(l1)

#l1.copy()  返回l1的备份的新对象
l1.copy()
print(l1)

#l1.clear()  清空列表中所有对象
l1.clear()
print(l1)


#元组
t1=(1,2,3)
print(t1)
print(type(t1))

t2=tuple("abdla")
print(t2)
print(t2[1])
print(t2[-1])

#元组的item不允许修改,这是与list最本质的区别
print(t1+t2)
print(t1*3)

#其余用法基本相似
print(len(t1))
print(min(t2))

#元组与列表的互相转化
l1=[1,2,3]
print(l1)
t3=tuple(l1)
print(t3)
l2=list(t3)
print(l2)

#元组对象的常用方法
#T.count(value)  计算value值在元组中出现的次数
#T.index(value)  找出某个对象第一个匹配项的索引位置,如果这个对象不在元祖中会报一个异常。

程序修仙之路 day 5
回复

使用道具 举报

9

主题

55

帖子

290

积分

中级会员

Rank: 3Rank: 3

积分
290
 楼主| 发表于 2020-2-24 20:26:22 | 显示全部楼层
本帖最后由 Angelica 于 2020-2-25 21:47 编辑

今天通过上面所学内容来完成一个程序设计

# 系统生成一个随机数字,玩家输入一个幸运数字进行匹配,如果值相等则提示“恭喜您猜中了”,如未猜中,则要告诉玩家是猜大了还是猜小了,直到玩家猜中为止
#程序设计:①生成随机数②用户输入数据③数据进行比较④猜对程序终止⑥没猜对就继续猜,直到猜对为止
#首先,通过random生成一个0-100之间的随机数字,包含0和100
import random
s = random.randint(0, 100)
#print(s)
#通过input让用户输入幸运数字
player_input=int(input("请输入0-100间的一个幸运数字:"))
if s==player_input:
    print("恭喜你猜对了!")
elif s>player_input:
    print("很遗憾,你猜小了!")
else:
     print("你猜大了,再猜一次吧!")

程序已经可以实现进行一次比较,如果要能多次比较,就要用到循环。为此,我们修改程序如下:
# 系统生成一个随机数字,玩家输入一个幸运数字进行匹配,如果值相等则提示“恭喜您猜中了”,如未猜中,则要告诉玩家是猜大了还是猜小了,直到玩家猜中为止
#程序设计:①生成随机数②用户输入数据③数据进行比较④猜对程序终止⑥没猜对就继续猜,直到猜对为止
#首先,通过random生成一个0-100之间的随机数字,包含0和100
import random
s = random.randint(0, 100)
#print(s)
#通过循环不断接受玩家的输入
while True:
    #将输入的数据转换为int类型,否则palyer_input与s进行比较时会进行报错
    player_input = int(input("请输入0-100间的一个幸运数字:"))
    #程序分支
    if s==player_input:
         print("恭喜你,猜对了!")
         break;
         #跳出循环
    elif s>player_input:
         print("很遗憾,你猜小了!")
    else:
         print("你猜大了,再猜一次吧!")

至此,程序就可以实现功能。而我们在进行猜数的时候,也建议使用中值法去猜。

程序修仙之路 day 6
回复

使用道具 举报

9

主题

55

帖子

290

积分

中级会员

Rank: 3Rank: 3

积分
290
 楼主| 发表于 2020-2-25 21:48:17 | 显示全部楼层
#今天来写一个程序,找出2017年1月1日之后的任意年份中的“黑色星期五”。
#已知:“黑色星期五”是指某个月的13号,如果恰逢星期五,就叫“黑色星期五”。
#又已知:2017年1月1日为星期天
#第一种方法,使用模块
import calendar
year=int(input("输入你要查询的年份:"))
print("符合的日期有:")
for month in range (1,13):
    if calendar.weekday(year,month,13)==4:
        print("%s-%s-13"%(year,month))
#这种方法不需要知道2017年1月1日是星期几,calendar模块中的weekday函数会返回给定日期的日期码

#第二种方法,不使用模块,就需要我们区别平闰年并且计算每一年的元旦是星期几
year=int(input("输入你要查询的年份:"))
Feb=28
m=0
if (year%400==0 or (year%4==0 and year%100!=0)):
    Feb=29
for i in range(2017,year):
    if(i%400==0 or (i%4==0 and year%100!=0)):
        m+=1
#计算每一年的元旦是星期几
start=((year-2017)*365+m)%7
year=str(year)
#接下来就开始以查询年份的元旦为起点,计算每个月十三号是星期几
print("符合的日期有:")
if ((start + (12 % 7)) % 7 == 5) :
    print(year + "-1-13")
if ((start + ((12+31) % 7)) % 7 == 5) :
    print(year + "-2-13")
if ((start + ((12+31+Feb) % 7)) % 7 == 5) :
    print(year + "-3-13")
if ((start + ((12+31+Feb+31) % 7)) % 7 == 5) :
    print(year + "-4-13")
if ((start + ((12+31+Feb+31+30) % 7)) % 7 == 5) :
    print(year + "-5-13")
if ((start + ((12+31+Feb+31+30+31) % 7)) % 7 == 5) :
    print(year + "-6-13")
if ((start + ((12+31+Feb+31+30+31+30) % 7)) % 7 == 5) :
    print(year + "-7-13")
if ((start + ((12+31+Feb+31+30+31+30+31) % 7)) % 7 == 5) :
    print(year + "-8-13")
if ((start + ((12+31+Feb+31+30+31+30+31+31) % 7)) % 7 == 5) :
    print(year + "-9-13")
if ((start + ((12+31+Feb+31+30+31+30+31+31+30) % 7)) % 7 == 5) :
    print(year + "-10-13")
if ((start + ((12+31+Feb+31+30+31+30+31+31+30+31) % 7)) % 7 == 5) :
    print(year + "-11-13")
if ((start + ((12+31+Feb+31+30+31+30+31+31+30+31+30) % 7)) % 7 == 5) :
    print(year + "-12-13")
#至此,代码可以实现其功能。

#总结:第一个代码用了短短几行完成,第二个却用了十几行,比第一个麻烦了很多。但同时,这也体现python内置函数的强大之处。
#今日份学习到此结束

程序修仙之路 day 7
回复

使用道具 举报

9

主题

55

帖子

290

积分

中级会员

Rank: 3Rank: 3

积分
290
 楼主| 发表于 2020-2-26 20:56:33 | 显示全部楼层
"""
循环
  1.for
  2.while
"""
#for循环
for item in [1,2,3,4]:
    print(item)
t=(1,1,1,0)
for item in t:
    print(item)
d={"name":"tom","age":18,"hobby":"coding"}
for item in d :
    print(item)
s={"110","120","119"}
for item in s:
    print(item)
s1="hello"
for item in s1:
    print(item)
#for item in 100:
#   print(item)
"""
list,tuple,set,dict,str都是可迭代元素
range(stop)
range(start,stop)
range(start,stop,step)
"""
for item in range(50,100,3):
     print(item)

#break  终止整个循环
#continue  跳过本次循环
for item in range(50,100,2):
    if item==60:
        #break
        continue
    print(item)

#while循环
while False :
    print("what?")

i=0
while i<10:
    i+=1
    if i==3:
        break
        continue
    print("what?")
#小学的鸡兔同笼问题,现在用一个简单的程序来解决
#二元一次函数解决方案:设鸡有x只,兔有y只;x+y=heads、2x+4y=feet解方程组即可

heads=int(input("笼中鸡兔的头数:"))
feet=int(input("笼中鸡兔的脚数:"))
for x in range(1,heads):
    y=heads-x
    if 2*x+4*y==feet:
        print("鸡有%d只,兔有%d只"%(x,y))

#求解银行存款利息问题
#已知银行存款利率为1.9%,编写程序计算并输出需要存多少年,10000的存款本金才会连本带利翻一番 。
#设需要n年,10000的存款本金才会连本带利翻一番。数学方程为  10000(1+1.9%)^n>=20000
cunkuan=10000
n=0
while cunkuan<20000:
    n+=1
    cunkuan*=(1+0.019)
print("需要%d年,10000的存款本金才会带利翻一番"%n)

程序修仙之路 day 8
回复

使用道具 举报

9

主题

55

帖子

290

积分

中级会员

Rank: 3Rank: 3

积分
290
 楼主| 发表于 2020-2-27 21:54:36 | 显示全部楼层
今天没学东西,高代数分整不明白
回复

使用道具 举报

9

主题

55

帖子

290

积分

中级会员

Rank: 3Rank: 3

积分
290
 楼主| 发表于 2020-3-2 21:12:09 | 显示全部楼层
奋战网课作业
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-27 22:22 , Processed in 0.023901 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表