wenke510 发表于 2022-7-22 09:35

python 我来啦!

本帖最后由 wenke510 于 2022-8-11 14:51 编辑

我是野生编程爱好者,不是学的计算机专业,工作从事的也不是编程相关,仅是爱好!

发现把笔记记录在本上找的时候不方便,学习场景太多了,也不适合上班摸鱼看,所以选择了把笔记写在腾讯文档中,随时保存,手机端、PC端都很方便点开。

还想问一句,有没有别的在线文档推荐 ?

第一次发帖经验不足,打开看了一下乱的狠。。。重新整理一下,加一个目录

目录
* 一、注释方法

* 二、变量三大组成部分
> 1、变量名
> 2、赋值符号=
> 3、变量值
> 4、s和=区别
> 5、小整数池
> 6、常量


* 三、基本数据类型
    > 1、整形int
    > 2、浮点型float
    > 3、符串str
    >> 3-1索引取值
    >> 3-2切片

   > 4、列表ist
    > 5、字典dict
    > 6、布尔类型b00l
    > 7、None空类型


* 四、垃圾回收机制
    > 1、引用和间接引用
    > 2、用计数
    > 3、标记清除
    > 4、分代回收

* 五、与用户交互
    >1.print( )
    >2.input()
    >3、格式化输出字符南
    >>3-1使用%
    >>3-2 format()
    >>3-3使用
    >3-4 string-Template


* 六、算数运算和比较运算
    >1、算数运算符
    >2、比较运算符

* 七、可变与不可变类型
    >1、不可变类型
    >2、可变类型


* 八、条件判断

* 九、逻辑运算符
    >1、逻辑与 and
    >2、逻辑或 or
    >3、逻辑非 not
    >4、优先级

* 十、成员运算符
    >1、in
    >2、not in

* 十一、if判断
    >1、单条件判断
    >2、两种条件判断
    >3、多种条件判断

* 十二、深浅拷贝
   >1、浅拷贝
   >2、深拷贝


* 十三、while循环
   >1、格式
   >2、死循环
   >3、退出while循环
   >4、循环嵌套
   >5、while+continue
   >6、while+else


* 十四、for循环
   >1、格式
   >2、与while区别
   >3、遍历字典
   >4、range介绍
   >5、for循环嵌套
   >6、九九乘法表


* 十五、数据类型转换与进制转换
   >1、数据类型转换
   >2、进制转换原理
   >3、python中进制转换
   >4、位运算符


* 未完


# 一、注释方法
单行注释:代码后一个 #    注意代码规范,代码后空两格,#后空一格

多行注释:三对单引号 或者 三对双引号 包起来的内容

```
# 这是单行注释

'''
这是使用三个单引号的多行注释
'''

"""
这是使用三个双引号的多行注释
"""

```


python对格式比较看重,写代码要注意规范,不然pycharm会有波浪线提示。。。

# 二、变量三大组成部分

## 1、变量名

命名:见名知意,大驼峰法,可用下划线,不可以数字开头,不能以关键字命名

## 2、赋值符号 =

```
neme = 'wenke'
```

注意,两个==为比较两个值是否相等

## 3、变量值

字符串需要用引号包裹,数字可以直接输入

```
name = 'wenke'
age = 18
```

简单说下id()、type()
id是用来反应变量值的内存地址的映射
例如:(>为输出内容)
```
id(name)
>64564564654
```

type()反应数据类型
例如:(>为输出内容)
```
type(name)
><class 'str'>
```

## 4、is 和 == 区别

is用来比较变量的内存地址是否相同
== 比较两边的变量值是否相等

## 5、小整数池
为了避免因创建重复的值而重复申请内存空间带来的效率问题,python解释器在启动的一刻就创建出小整数池
范围-5~256

## 6、常量
用全大写的变量名表示常量
python中没有常量的概念,但在开发中常会用到常量比如圆周率
可以把变量名的所有字母换成大写,以表示常量,这并不是python明确规定的,而是一种约定俗成

```
PIE = 3.141592653589
```

# 三、基本数据类型
## 1、整形 int
也就是整数,这个很简单

## 2、浮点型 float
也就是带小数点的

数字类型可以进行数学运算 逻辑运算

## 3、字符串 str
str可以进行字符串相加,但是不建议

一个小功能
```
print('name' * 5)
>namenamenamenamename
```

### 字符串类型的内置方法

### 3-1 索引取值

python给按顺序排列的类型都设置了索引的概念。
注意,空格也算一个字符,也可以通过索引取到。
因为str类型属于不可变类型,所以不可以通过索引来改变str数据的值。

```
info = 'good good study'

print(info)
>g

print(info[-1])
>y

```

### 3-2 切片
并不会改变原字符串,而是生成一个新的字符串

```
info = 'good good study'

print(info)# 取0、1、2、3的值
>good

print(info)# 从0开始往后取
>good good study

print(info[:4])# 取到第3个索引值
>good

print(info)# 从第4个索引值开始往后取
>good study

print(info)# 可以设置步长,每次加2,0、2
>go

print(info)# 反向步长,从索引4往左取值4、3、2、1
>(空格)doo

print(info[::-1])# 反向取所有值
>yduts doog doog

```

### 3-3 strip()去除空格
### 3-4 splite()拆分
### 3-5 循环
### 3-6 长度len
### 3-7 成员运算in not in

## 4、列表 list
按位置(索引)记录数据,索引从0开始,0对应第一个值
结构:变量名 = [ …… ,……, ……] 英文状态下的中括号,每个变量值用逗号隔开
str、int、float、甚至是列表都可以放在列表中,列表可以嵌套列表,可以一直嵌套下去

```
hobbies = ['可乐‘, 123, 'basketball', ,3.5]
```

取值:按照索引 如:

```
print(hobbies)
>可乐
print(hobbies)# 取值列表中的列表的值
>234
print(hobbies[-1])# 可以倒着取值,-1就是最后一个值
>3.5

```

列表一般用来存同一种属性的
同一类实物的不同状态可以用列表的嵌套

## 5、字典 dict
定义方式   `{key:value, key:value,……}`

取值,用key来取值,`字典名称`

```
dic = {'name': wen, 'age':25, 'height': 175}
print(dic['name'])
>wen
```

列表和字典可以互相嵌套

取值方法: `变量名['name']`

## 6、布尔类型 bool

只有两个值 TrueFalse

## 7、None 空类型

# 四、垃圾回收机制
## 1、直接引用和间接引用

先说下直接引用和间接引用的概念。

直接引用

```
name = 'wen'
if name == wen:
……

```

间接引用,相当于把name的值直接放在dic中

```
name = 'wen'
dic = {name, 'age':25, 'height': 175}

```

列表在内存中的存储方式(字典同理)

## 2、引用计数
如果引用为0将会被当作垃圾清除,但这种工作方式有问题。

如果两个变量互相引用,你中有我,我中有你,又使用del解除了变量与变量值之间的绑定关系,这时候我们是没有办法访问到这两个变量,这时候变量值应该被垃圾回收机制清除

但是引用计数不为0,所以没有办法被清除。这就叫循环引用造成的内存泄露问题。

当然python也给出了另一种解决方案,标记清除。

## 3、标记清除
知识补充:变量名一般会存储在栈区,变量值会存储在堆区

标记清除会在python程序内存空间不够用的时候,
将整个程序暂停下来,扫描栈区,
把通过栈区所有能引用到的值,
不管是直接引用还是间接引用的值都标记为存活状态,
一旦发现有通过栈区引用不到的值,
都标记为死亡状态会被直接清理掉,
就算该值的引用计数不为0也会被清理掉。


## 4、分代回收
尽管垃圾可以被回收掉了,但还有个弊端,就是基于引用计数的垃圾回收机制每次回收内存都需要把所有对象的引用计数都遍历一遍,效率非常低。

根据权重来进行扫描,以解决以引用计数的效率问题。

# 五、与用户交互
## 1、print()
输出,默认换行,因为end=/n,如果不想换行,可以将end的值改为空字符

```
print('不要换行',end=' ')
```

## 2、input()

```
name = input("请输入你的名字:")
print(name)

```

input所有输入的内容数据类型都为str

如果需要输入年龄等数据型内容,可以使用int()转换为整型

int只能把纯数字的文本转成整形,有小数点、字母等都不可以

在python2中,input的功能为输入什么类型就保存为什么类型的数据,但是对于用户来说非常不方便,比如要输入字符串还需要加上引号才可以,所以在python3中取消了这个限制。

## 3、格式化输出/字符串
### 3-1使用%

假如要输出这样的数据,xxx是要替换的数据

`"my name is xxx , i am from xxx"`

**方法:在xxx的位置放上%s、%d ,相当于一个占位符。**

s 代表字符串的意思,可以传任意类型的值(整形、浮点型、列表、字典、布尔型等),都会当作str来处理。

d 表示接收一个整型数据,只能接收整形数据,否则会报错。

传值的方法:按位置传递值、不按位置传递值

①按位置传递值:在后边接一个%,然后括号放入值,可以是变量名,也可以直接输入值

```
info = "my name is %s , i am from %s" % ("wen","山西")
```

②不按位置传递值:需要在后边接一个字典,用key来传值

```
info = "my name is %(name)s , i am from %(hometown)s" % {‘hometown':'山西', 'name':'wen'}
```

### 3-2format()

format是字符串的专属功能字符串.format(),接受值的地方为大括号

```
"my name is { } , i am from { }" . format("wen","山西")
```

大括号中可以什么都不写,按位置传值;

可以按照索引传值

```
"my name is {0} , i am from {1}" . format("wen","山西")
```

可以不按位置,按照key=value的方法传值,和上边类似

```
"my name is {name} , i am from {hometown}" . format(hometown='山西', name='wen')
```

**format小知识**

**①格式化填充**

用字串填充然后用*填充,使字符串的总个数为10

想要输出 `****开始****`

可以用以下代码实现:
```
a = '{0:*^10}' .format('开始')
>****开始****
```

0表示索引,如果只有一个值的话可以不写。
key=value传值的话,可以写key;
冒号必须写;
*就为填充符号,可以改成任意想填充的任意内容;
上箭号 ^ 表示居中填充 ,也可以改为 > 表示填充左边或者 < 表示填充右边;
10表示为填充的总长度;

**②小数的精度控制**

.2f表示四舍五入保留2位小数

```
b = '{num:.2f}' .format(num=3.1415926)
>3.14
```

### 3-3 使用f

这个是python3.5版本以后才有的
```
name = input('请输入你的名字:')
hometown = input('你来自哪里:')
info = f'我的名字是{name},我来自于{hometowm}'
```

**这三种方式有明显的速度上的区别:**

**f > format > % **

**最常用的就是 f 和 format**

如果考虑兼容性的问题,比如python3.5、2.7以下优先 format
如果python3.5以上优先 f

### 3-4 string-Template(需要导入)

基于python的标准库string,后续再说

# 六、算数运算和比较运算
## 1、 算数运算符
加减乘除 +- × /
单斜杠表示除以10/3=3.33333
双斜杠表示取整数10//3=3
%模运算,也就是取余数10%3=1
两个*表示幂运算2 ** 2 = 4、2 ** 3 = 8
## 2、 比较运算符
大于      小于      大于等于      小于等于      等于      不等于
>      <      >=      <=      ==      !=
# 七、可变与不可变类型
## 1、 不可变类型
str 、int 、float
## 2、 可变类型
列表list、字典dict

# 八、条件判断
判断某个条件是true还是false,然后继续执行条件。
布尔值类型有两种:
显式布尔值:直接判断出来是true还是false
隐式布尔值:部分值代表的就是true或者false,比如0 、None 、空(空字符串、空列表、空字典)都代表false



# 九、逻辑运算符
## 1、 逻辑与 and
只要有一个是false,结果就为false

## 2、 逻辑或 or
只要有一个结果是true,结果就为true

## 3、 逻辑非 not
如果本来结果为true,使用not之后就,结果就为false

## 4、 优先级
not> and > or

# 十、成员运算符
## 1、 in
判断某个字符串是否在另一个字符串中,或key值是否在这个字典dict中。
```
'wen' in 'my name is wen'
>true
dic={'name':'wen','age':18}
'wen' in dic
>false
'name' in dic
>true
```

## 2、 not in
判断是否不在里边
```
'wen' not in 'my name is wen'
>false
```

# 十一、if 判断
格式,必须严格执行格式缩进,否则会报错

## 1、单条件判断
```
if 条件:
    代码1
    代码2
    ……
```

## 2、两种条件判断
```
if 条件:
    代码1
    代码2
    ……
else:
    代码3
    ……
```

## 3、 多种条件判断
elif可以写很多,else可写可不写
只会成功运行一个代码块
```
if 条件:
    代码1
    代码2
    ……
elif 条件2:
    代码3
    ……
elif 条件3:
    代码4
    ……
else:
    代码5
    ……
```

# 十二、深浅拷贝
## 1、浅拷贝

```
l1=['wen','wxb','awen'['xiaobao','acheng']]
l2=l1
```

这时候的l2和l1的内存地址完全相同
```
l1=['wen','wxb','awen'['xiaobao','acheng']]
l3=l1.copy()
```

这时候把l1的数据浅拷贝给了l3,l1和l3的内存地址不同,但是列表索引的ID是一样的。

浅拷贝只是拷贝了容易本身,里边的数据还是一样的

如果更改一下l3列表索引对应的值

```
l1=['wen','wxb',['xiaobao','acheng']]
l3=l1.copy()
l3 = 'www'
l3 = 'ccc'
l3 = 'llll'
l3 = 'eeee'
print(l1)
>l1=['wen','wxb',['llll','eeee']]
print(l2)
>l3l=['www','ccc',['llll','eeee']]
```

会发现l3列表的所有值都变了,而l1只有子列表的值改变了。

这是因为浅拷贝只会把原列表的第一层的索引和内存地址一摸一样拷贝到新的内存空间里,

由于这个列表的第1和第2个元素是字符串不可变类型,所以当我们改l3列表的时候,又会申请新的内存空间,用来存储我们新的值,但是原列表指向的还是新的内存地址;

但由于列表是可变类型,所以当我们改子列表的时候,它的内存地址是不会变的

所以l1列表和l3列表里面存的还是原来的子列表的内存地址,值是可以被改变的。

**浅拷贝:会把原列表第一层存的索引和内存地址完全拷贝一份给新列表,如果原列表存的都是不可变类型,浅拷贝就可以正常使用,新列表改动后产生的都是新的值和内存地址,不会影响到原列表,但原列表一旦包含了可变类型,浅拷贝的新列表就没办法和原列表完全分开了。**

如果想要把新列表和原列表完全区分,不管存的是可变类型还是不可变类型,就要用到深拷贝。

## 2、深拷贝

import copy,导入一个别人写好的功能,这个包有个函数叫deepcopy,可以实现深拷贝

```
l1=['wen','wxb',['xiaobao','acheng']]
import copy
l3 = copy.deepcopy(l1)
```

这时候l3列表与l1列表的内存地址不相同,但是索引下的内存地址是相同的,这是因为我们没有改变值,现在还是公用一个地址,起到节省内存空间的目的

如果我们改变了值,内存地址就会发生改变。

现在来改变一下l3列表的值:
```
l1=['wen','wxb',['xiaobao','acheng']]
import copy
l3 = copy.deepcopy(l1)
l3 = 'www'
l3 = 'ccc'
l3 = 'llll'
l3 = 'eeee'
print(l1)
>l1=['wen','wxb',['xiaobao','acheng']]
print(l2)
>l3=['www','ccc',['llll','eeee']]
```

可以看到,改变l3列表的内容时,l1列表的值完全没有改变

而且l3列表的索引内存地址也改变了。

**如果想要拷贝一个列表,并且想要新列表和原列表完全独立开,就需要用到深拷贝。**









## **十三、while循环**

#### **1、格式**

```
while 条件:
子代码1
子代码2
……
```



#### **2、死循环**

让cpu不停的运算,会造成致命的效率问题



```
while 1:
10+10
```



#### **3、退出while循环**

①可使条件变成false

②使用break,当代码遇到break的时候,跳出本层循环。

#### **4、循环嵌套**

while可以嵌套使用,如果某一层的循环使用了break代码,那上级的每一层都应该配一个break代码

#### **5、while+continue**

表示结束本层循环,并进入下一层循环

#### **6、while+else**

else表示的意思在while循环正常结束后,也就是不被break打断的情况下才会执行

代码格式:



```
while True:
……
else:
……
```



## **十四、for循环**

for循环和while循环都是重复执行某一部分代码

理论上for循环可以做的事,while循环都可以实现,但for循环在取值上比while循环取值更简洁。

循环取值也叫做遍历,就是把一个类型里的数据一个个循环取出来。

列表、字典、字符串都是可以遍历的

#### **1、语法**



```
for 变量名 in 可迭代对象:
子代码块
……
```





#### **2、与while区别**



```
l = ['wwww', 'zzz', 'a']
for a in l:
print(a)
>www
>zzz
>a
```



列表中的值被依次取出来了

for循环多少次取决于有多少值,for又叫做遍历循环、迭代循环、取值循环

while循环多少次取决于条件,while又叫做条件循环



#### **3、遍历字典**



```
dic = {'name':'wcl','age':18, 'height':180}
for i in dic:
print(dic)
```





也可以遍历字符串,注意空格也算一个字符



```
s = 'hello world'
for i in s:
print(s)
```





也可以用索引遍历列表的值

#### **4、range介绍**

range() 可以控制for循环的次数

range取数顾头不顾尾



```
range(5)
>
```



```
range(1,5)
>
```



可以设定步长

```
range(1,9,2)
>
```



range在python2和python3使用有区别

python2中会直接给一个列表,如果数据多非常消耗内存;

python3中做了空间上的优化,会给一个迭代器

用法和结果没有区别。

#### **5、for循环嵌套**

①break、continue、else用法都是一样的

②for循环嵌套

```
for i in range(1,10):
    print(‘外层循环', i)
    for j in range(1,10):
      print('内层循环', j)
```

外层循环循环1次,内层循环会完整的循环一遍,也就是从1-9,然后外层循环继续循环1次,内层循环再循环一遍……

for循环嵌套退出的方式只有break,只能退出本层循环。

#### **6、九九乘法表**

   

修改后:



**转义字符**




```
\n 换行
\t 制表符
```





格式化输出



```
print('%s×%s=%s ' % (j, i, i * j), end='\t')
print(f'{j}×{i}={i*j}', end='\t')
```





## **十五、数据类型转换与进制转换**

#### **1、数据类型转换**

int()可以把纯数字的数据转换为整型,但是字符串和带小数点的数都不能转换



```
age = int(input('请输入你的年龄:')
```





float()可以将数据转换为浮点型数据,可以将纯整数型、纯带小数的数转换为浮点型



```
a = float(1)
print(a)
>1.0
```





str()可以把任意类型转换为字符串



```
result = str(['www','ccc','lll'])
print(result, type(result))
>['www','ccc','lll'] <class='str'>
```







#### **2、进制转换原理**









#### **3、python中进制转换**

十进制转二进制(0b表示二进制)



```
pring(bin(12))
>0b1100
```





十进制转八进制(0o表示八进制)



```
print(oct(12))
>0o14
```





十进制转十六进制(0o表示八进制)



```
print(hex(12))
>0xc
```





二进制转十进制



```
int('0b1100', 2)
```





八进制转十进制



```
int('0o14', 8)
```





十六进制转十进制



```
int('0xc', 16)
```





#### **4、位运算符

hbwxszj 发表于 2022-7-22 10:55

加油,学习的过程是痛苦的,结果是悲催的。用好才是舒畅的

整数型,浮点型,文本型

suyanvae 发表于 2022-7-22 10:56

大佬厉害

螢之光 发表于 2022-7-22 10:57

迭代器 生成器 能否讲解一下 ?

ladan123 发表于 2022-7-22 10:58

我放弃了

aSanPao 发表于 2022-7-22 10:59

厉害&#128077;&#127995;

andyjohnson2022 发表于 2022-7-22 11:00

俺也是自学的,一起加油!!!!

tslshuli 发表于 2022-7-22 11:02

装饰器我表示搞不明白

oynn 发表于 2022-7-22 11:05

tslshuli 发表于 2022-7-22 11:02
装饰器我表示搞不明白

你要先了解闭包,才能够了解装饰器!

gemini4422335 发表于 2022-7-22 11:05

自学,但是装饰器是一点都没搞懂
页: [1] 2 3 4
查看完整版本: python 我来啦!