安全矩阵

 找回密码
 立即注册
搜索
查看: 419|回复: 16

马璐学习日记

[复制链接]

3

主题

19

帖子

97

积分

注册会员

Rank: 2

积分
97
发表于 2020-2-17 21:39:38 | 显示全部楼层 |阅读模式
查询对象数据类型
>>>x=20
>>>print(type(x))
<class 'int'>

>>>x="English"
>>>print(type(x))
<class 'str'>

>>>print(type(True))
<class 'bool'>
输出句子中有换行,可以用三引号或者在需要换行的位置添加反斜杠。
>>>s1='''hello,
>>>world'''
>>>print(s1)
hello,
world

>>>s1="hello,\
>>>world"
>>>print(s1)
hello,world
布尔表达式
>>>x,y=10,20
>>>print(bool(x>y))
False
>>>x,y=10,20
>>>print(bool(x+10>=y))
True
判断是否为偶数
>>>x=384
>>>print(bool(x%2==0))
True
字符串可以使用单引号也可以使用双引号
如果字符串本身带走引号,要用转义字符。
>>>'\"hello\"'
'"hello"'
连接
>>>print('shang'+'hai')
shanghai
复制
>>>print("o"*5)
ooooo
输出字符串里特定位置的字符
>>>s="hello"
>>>print(s[0])
h
>>>s="hello"
>>>print(s[-1])
o
>>>s="hello"
>>>print(s[2:4])
ll
>>>s="hello"
>>>print(s[:2])
he
>>>s="hello"
>>>print(s[2:])
llo
子串测试操作
>>>s="hello"
>>>print(bool('ho'in s))
False
查询字符串中某一字母出现次数
>>>s="hello"
>>>print(s.count('l'))
2
查询字符串中某一成分第一次出现的位置
>>>s="hello"
>>>print(s.find('he'))
今日最大收获:菜鸡不努力是只配大佬用放大镜鄙视的。(´;︵;`)
回复

使用道具 举报

3

主题

19

帖子

97

积分

注册会员

Rank: 2

积分
97
 楼主| 发表于 2020-2-18 20:28:14 | 显示全部楼层
将字符串"123"转化为整数123
>>>print(int("123"))
123
将浮点数变为整数
>>>print(int(12.8))
12
将任意值变为字符串repr(obj)
>>>x=10*3.25
>>>y=200*200
##字符串加引号,repr不用加引号。
>>>s='The value of x is '+repr(x)+',and y is '+repr(y)+'.'
>>>print(s)
The value of x is 32.5,and y is 40000.
按四舍五入保留n位小数
##逗号前是要执行操作的数,后面是要保留的位数。
>>>print(round(12.3456,2))
12.35
>>>print(round(12.3456,1))
12.3
计算字符串的长度
>>>print(len("good morning"))
12

非内置模块库
1.非内置模块的导入
方式(1)
>>>import math
>>>print(math.pi)
3.141592653589793
>>>import math
##因为pi是math中才有的,所以要在pi前加上math. 。不能直接用pi。
##求pi的2次方
>>>print(math.pow(math.pi,2))
9.869604401089358
>>>import math
>>>print(math.sqrt(16))
4.0
方式(2)
>>>from math import sqrt
>>>print(sqrt(16))
4.0
导入math模块中所有函数定义
>>>from math import*
##import和*之间的空格可有可无
>>>print(sqrt(16))
4.0
非内置模块的导入总结:
一:
导入模块
         import[模块名]
调用函数
         [模块名]. [函数或字面常量]
二:
导入模块的函数
        from  [模块名]  import  [函数名]
调用函数
        [函数或字面常量]

两种方法比较:
一:
>>>import math
>>>print(math.sqrt(16))
4.0
二:
>>>from math import sqrt
>>>print(sqrt(16))
4.0
方法一(导入模块)中print语句中的sqrt(函数名)前必须有math. (模块名.)
方法二(导入模块的函数)中print语句中的sqrt(函数名)前不能有math. (模块名.)
回复

使用道具 举报

3

主题

19

帖子

97

积分

注册会员

Rank: 2

积分
97
 楼主| 发表于 2020-2-19 17:53:03 | 显示全部楼层
字母串的连接
>>>a=["hello","world"]
>>>b="!". join(a)
>>>print(b)
hello!world
字符串的分裂
>>>str="hagafada"
>>>print(str.split('a'))
['h','g','f',"d"]
这里还有一种分离文件名和路径的方法
os.path.split('PATH')
PATH指一个文件的全路径作为参数,如果给出的是一个目录和文件名,则输出路径和文件名。如果给出的是一个目录名,则输出路径和为空文件名。

所有的程序都可以用三种基本程序结构写出来
1.顺序结构
2.分支结构
3.循环结构

1.python简单分支

>>>numA=3
>>>numB=4
>>>if numA<=numB:##冒号不能忘记
>>>    print("numB较大")
numB较大

2.python双分支

>>>numA=3
>>>numB=4
##if 和 else 同级,else和if对齐
>>>if numA=numB:
>>>    print("numB较大")
>>>else:##else 后面的冒号也不能忘
>>>    print("numA较大")
numB较大

3.分支嵌套

>>>numA=3
>>>numB=4
>>>numC=5
>>>if numA<=numB:
>>>    if numC<numB:
>>>        print("numB较大")
>>>    else:
>>>        print("numC较大")
>>>else:
>>>    if numC<numA:
>>>        print("numA较大")
>>>    else:
>>>        print("numC较大")
numC较大

关于为什么分支结构里print语句缩进可以不一样的问题,可能我还没有顿悟吧

4.多分支结构

>>>numA=3
>>>numB=4
>>>numC=5
>>>if numA>=numB and numA>=numC:
>>>    print("numA是最大值")
>>>elif numB>=numC and numB>=numA:
>>>    print("numB是最大值")
>>>else:
>>>    print("numC是最大值")
numC是最大值

循环结构程序

1.for循环

>>>alp=["a","b,"c"]
>>>for y in alp:
>>>    print("alp",y)
alp:a
alp:b
alp:c
总结:
for 变量 in 序列:
    循环体
else:
    表达式
循环退出时,执行else语句。

2.遍历一个数字序列[用内建函数range()]
>>>for i in range(0,100,10):
>>>    print(i)
0
10
20
30
40
50
60
70
80
90
总结:range(0,100,10)中的0代表数字序列开端(含),100代表数字序列末端(不含)。10代表想输出的数列的公差。如果是range(1,100)就是输出1 2 3 …99
如果是range(100)就是输出0 1 2 3...99
如果是注意:print语句在for循环之下,需要缩进。
回复

使用道具 举报

3

主题

19

帖子

97

积分

注册会员

Rank: 2

积分
97
 楼主| 发表于 2020-2-20 21:34:11 | 显示全部楼层
输出星号图形

>>>for i in range(1,11):
>>>    s=""
>>>    for j in range(0,i):
>>>        s+="*"
>>>    print(s)

结果
*
**
***
****
*****
******
*******
********
*********
**********
总结:和C语言类似
>>>for i in range(1,11):
>>>    for j in range(0,i):
>>>        s=i*"*"
>>>    print(s)
结果与上面相同。第一次把print语句和s=i*"*"对齐了,导致输出结果为
*
**
**
***
***
***
****
****
****
****
*****
*****
*****
*****
*****
******
******
******
******
******
******
*******
*******
*******
*******
*******
*******
*******
********
********
********
********
********
********
********
********
*********
*********
*********
*********
*********
*********
*********
*********
*********
**********
**********
**********
**********
**********
**********
**********
**********
**********
**********
果然python的缩进很重要,一不小心就错了。改正之后就可以输出正确结果了。
想到C语言里有自增自减,类比于C,用python中变量的增减来实现相同需求。
试了一下报错了。看了一会发现自己癫了,自增自减是对于变量而言,字符没有自增自减。
然后才发现一层循环就可以了。
for i in range(1,11):
    s=i*"*"
    print(s)
可以正确输出。

break语句

>>>li=["a","b","c"]##试了一下方括号可以去掉
>>>for i in li:
>>>    if i=="c":
>>>        break
>>>    else:
>>>        print(i)
结果:a
b

统计字符序列里的字符个数

>>>string="a,b,c,d,e"
>>>li=string.split(',')
>>>print("有"+str(len(li))+"个字母")
结果:
有5个字母。
总结:现在感觉split用起来好像很方便,,,将字符串以某一字符分割开,详细的在第一篇帖子里。len()计算分割后的字符序列长度。
>>>li='a','b','c'
>>>print("有"+str(len(li))+"个字母")
有3个字母
str(len(li))将数字3转换为字符输出,如果没有str(),会报错。

字符串mystr是“0122202341020303”,把该数奇数位置的数用‘-’代替。
mystr="0122202341020303"
print(mystr+"\n")
li=list(mystr)##将字符串转换成字符序列
for i in range(1,len(li),2):##找到奇数位置的数字
     li[i]='-'
mystr="".join(li)
print(mystr)
回复

使用道具 举报

3

主题

19

帖子

97

积分

注册会员

Rank: 2

积分
97
 楼主| 发表于 2020-2-21 21:44:08 | 显示全部楼层
在某个字符串中查找特定的字符
可以通过对字符串进行遍历
也可以通过字符串的函数处理。

在字符串中查找是否有字符“梦”存在。
while True:
    str=input("输入字符串\n")
findok=False
        for mychar in str:
          if mychar=="梦":
              findok=True
              break
        if findok:
            print("有")
        else:
            print("没有")

自己试了一下
str=input("输入字符串\n")
for i in str:
    if i=="a":
        print("yes")
    else:
        print("no")
输入字符是a时可以正常运行,输入字符b时会报错,不清楚为什么。
我知道了,第二次输入的b并没有赋给str,所以会报错。
回复

使用道具 举报

3

主题

19

帖子

97

积分

注册会员

Rank: 2

积分
97
 楼主| 发表于 2020-2-24 21:13:44 | 显示全部楼层

上个实例介绍了字符串遍历,但是for 字符 in 字符串这种类型的遍历是无序的,
只强调了字符有没有包含在字符串中,但是字符在具体在哪个位置是未知的。以下是有序遍历。
输入任何一个数字,如果数字中的每位数字之和(最高位除外),等于最高位上的数,则输出找到了,否则输出找不到。
while True:
    sum=0
    str=input("请输入一个数字(quit退出)\n")
    if(str=="quit"):
        break
    else:
        for i in range(1,len(str)):
          sum=sum+int(str[i])
        if sum==int(str[0]):
            print("找到了")
        else:
            print("找不到")

自己尝试编写实现相同需求:
sum=0
str=input("输入一个数字\n")
for i in range(1,len(str)):
    sum=sum+int(str[i])
if sum==int(str[0]):
    print("找到了")
else:
    print("找不到")

运行结果:
输入一个数字
>>>91233
找到了
>>> 612
612

但是这个程序不能连续判断数字是否符合要求。以下是修改。

i=0
while i==0:
    sum=0
    str=input("输入一个数字\n")
    for i in range(1,len(str)):
        sum=sum+int(str[i])
    if sum==int(str[0]):
        print("找到了")
    else:
        print("找不到")

运行结果:
输入一个数字
633
找到了
>>> 612
612

仍然不能连续判断,观察程序,发现i的值变化了,变量重复了,以下是把变量i换成变量j的程序。

j=0
while j==0:
    sum=0
    str=input("输入一个数字\n")
    for i in range(1,len(str)):
        sum=sum+int(str[i])
    if sum==int(str[0]):
        print("找到了")
    else:
        print("找不到")


运行结果:
输入一个数字
633
找到了
输入一个数字
612
找不到
输入一个数字

ok了,emmmm一个简单的需求出了那么多的错,,,还是要多看看才行。
回复

使用道具 举报

3

主题

19

帖子

97

积分

注册会员

Rank: 2

积分
97
 楼主| 发表于 2020-2-25 20:32:50 | 显示全部楼层
集合的特点

集合是无序的,不能通过数字进行索引。
集合的元素不能重复出现

集合的应用

去除列表中的重复元素
求两个列表的相同元素(交集)
求两个列表的不同元素(差集)

创建集合

Python的集合可分为可变集合(set)和不可变集合(frozenset)
对可变集合,可以添加和删除元素,
对不可变集合 则不允许添加和删除元素这样
使用{}创建的是可变集合set,{}中用逗号分隔的数据项作为集合的一个元素。
通过类型构造器set()和frozenset()创建不同类型的集合。
s=set('hello')
print(s)
运行结果:
{'h', 'e', 'l', 'o'}
同样还可以根据列表对象来创建集合
s=set(['he','is','a','boy'])
print(s)
运行结果:
{'he', 'a', 'is', 'boy'}

通过set函数建立列表的去重复集合元素,再通过list方法根据集合创建列表:
l=[1,2,3,4,1,2,3,4]
s=set(l)
print(s)
运行结果:
[1,2,3,4]
今天没有学什么,明天再学,网课杀我














回复

使用道具 举报

3

主题

19

帖子

97

积分

注册会员

Rank: 2

积分
97
 楼主| 发表于 2020-2-26 18:15:16 | 显示全部楼层
判断s1和s2的包含关系。
s1={"hello"}
s2={"hello","my","girl"}
print(bool(s1<=s2))
运行结果:
Ture
以上接昨天
以下是今天的
求10以内所有3和5的倍数的和。
len=int(input('please int a num:'))
sum=0
for i in range(len):
    if i%3==0 or i%5==0:
        sum+=i
print(sum)
运行结果:
233168
下面是通过数学中等差数列公式来计算。
len=int(input('please input a num:'))
def sum(x):
    n=(len-1)//x
    return x*n*(n+1)/2
res=sum(3)+sum(5)-sum(15)
print(int(res))
运行结果:
233168
第二个中res结果要减去sum(15)的原因是:既是3的倍数也是5的倍数的数被重复计算了,一次在是3的倍数里加了一次,另一次是在5的倍数里加了一次。
第一个中不用减去的原因是只要是3或者5的倍数,就计入sum中,计入之后就继续往后面遍历。不会有重复的情况 。
下面是一个小闹钟吧。可能没啥实际用途哈哈哈
import time
def alarm(hour,minute):
    while True:
        t=time.localtime()##类似于gmtime(),将格式化时间转换成本地时间。得到时间元素。
        h,m,s=t[3:6]##用切片取时分秒
        print("%02d:%02d:%02d"%(h,m,s),end='\r')
        if hour==h and minute==m:
            print("时间到!!")
            break
        time.sleep(1)##表示进程挂起的时间,暂停给定秒数后执行程序。用法:time.sleep(t)
h=int(input("输入小时:"))
m=int(input("输入分钟:"))
alarm(h,m)##开启定时器,时间到后给调用alarm的进程发送一个SIGALRM信号。
回复

使用道具 举报

3

主题

19

帖子

97

积分

注册会员

Rank: 2

积分
97
 楼主| 发表于 2020-2-27 19:52:02 | 显示全部楼层
今天一天都在上网课,看视频做笔记。☹️
回复

使用道具 举报

3

主题

19

帖子

97

积分

注册会员

Rank: 2

积分
97
 楼主| 发表于 2020-3-2 19:55:33 | 显示全部楼层
问题
python关键字 yield 的作用是什么

比如:

def node._get_child_candidates(self, distance, min_dist, max_dist):
    if self._leftchild and distance - max_dist < self._median:
        yield self._leftchild
    if self._rightchild and distance + max_dist >= self._median:
        yield self._rightchild
下面的是调用:

result, candidates = list(), [self]
while candidates:
    node = candidates.pop()
    distance = node._get_dist(obj)
    if distance <= max_dist and distance >= min_dist:
        result.extend(node._values)
    candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))
return result
当调用 _get_child_candidates 的时候发生了什么?
回答

首先可迭代对象是:

当建立了一个列表,可以逐项地读取这个列表,这叫做一个可迭代对象:

>>> mylist = [1, 2, 3]
>>> for i in mylist :
...    print(i)
1
2
3
mylist 是一个可迭代的对象。当使用一个列表生成式来建立一个列表的时候,就建立了一个可迭代的对象:

>>> mylist = [x*x for x in range(3)]
>>> for i in mylist :
...    print(i)
0
1
4
所有可以使用 for .. in .. 语法的叫做一个迭代器,但是所有的值都存储到了内存中,如果大量数据的话这个。方式不太行。

生成器

生成器是可以迭代的,但是只可以读取它一次 ,因为它并不把所有的值放在内存中,它是实时地生成数据:

>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator :
...    print(i)
0
1
4
看起来除了把 [] 换成 () 外没什么不同。但是不可以再次使用 for i in mygenerator , 因为生成器只能被迭代一次:先计算出0,然后继续计算1,然后计算4,一个跟一个的…

yield 关键字

yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器。

>>> def createGenerator() :
...    mylist = range(3)
...    for i in mylist :
...        yield i*i
...
>>> mygenerator = createGenerator() # create a generator
>>> print(mygenerator) # mygenerator is an object!
<generator object createGenerator at 0xb7555c34>
>>> for i in mygenerator:
...     print(i)
0
1
4
这个函数会返回一大批只需要读一次的值.

当你调用这个函数的时候,函数内部的代码并不立马执行 ,这个函数只是返回一个生成器对象

那么,函数内的代码什么时候执行呢?是当使用for进行迭代的时候

第一次迭代中函数会执行,从开始到达 yield 关键字,然后返回 yield 后的值作为第一次迭代的返回值. 然后,每次执行这个函数都会继续执行在函数内部定义的那个循环的下一次,再返回那个值,直到没有可以返回的。

如果生成器内部没有定义 yield 关键字,那么这个生成器被认为成空的。这种情况可能因为是循环进行没了,或者是没有满足 if/else 条件。

回到代码

生成器:

# Here you create the method of the node object that will return the generator
def node._get_child_candidates(self, distance, min_dist, max_dist):

  # Here is the code that will be called each time you use the generator object :

  # If there is still a child of the node object on its left
  # AND if distance is ok, return the next child
  if self._leftchild and distance - max_dist < self._median:
            yield self._leftchild

  # If there is still a child of the node object on its right
  # AND if distance is ok, return the next child
  if self._rightchild and distance + max_dist >= self._median:
                yield self._rightchild

  # If the function arrives here, the generator will be considered empty
  # there is no more than two values : the left and the right children
调用者:

# Create an empty list and a list with the current object reference
result, candidates = list(), [self]

# Loop on candidates (they contain only one element at the beginning)
while candidates:

    # Get the last candidate and remove it from the list
    node = candidates.pop()

    # Get the distance between obj and the candidate
    distance = node._get_dist(obj)

    # If distance is ok, then you can fill the result
    if distance <= max_dist and distance >= min_dist:
        result.extend(node._values)

    # Add the children of the candidate in the candidates list
    # so the loop will keep running until it will have looked
    # at all the children of the children of the children, etc. of the candidate
    candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))

return result
这个代码包含了几个小部分:

对一个列表进行迭代,但是迭代中列表还在不断的扩展。它是一个迭代这些嵌套的数据的简洁方式,但是可能导致无限迭代。 candidates.extend(node._get_child_candidates(distance, min_dist, max_dist)) 穷尽了生成器的所有值,但 while 不断地在产生新的生成器,它们会产生和上一次不一样的值,既然没有作用到同一个节点上.

extend() 是一个迭代器方法,作用于迭代器,并把参数追加到迭代器的后面。

通常我们传给它一个列表参数:

>>> a = [1, 2]
>>> b = [3, 4]
>>> a.extend(b)
>>> print(a)
[1, 2, 3, 4]
但是在代码中的是一个生成器,可以有很多子对象。
回复

使用道具 举报

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

本版积分规则

小黑屋|安全矩阵

GMT+8, 2020-5-27 04:56 , Processed in 0.012616 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

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