作为一个python入门仅两个月的小白的我来说,学到的越多,越怕忘记,总想把学到的东西记录下来,转化为自己的东西。于是……咳咳……今天开启python小白笔记系列短文,码字很爽,一直码一直爽,但日更,是不可能的,这辈子都不会日更……
变量
概念
变量变量,就是会变的量(小声逼逼:谁不会说)。那我们可以把变量比喻成一个容器,里面装啥都行。碗总该见过吧,想吃啥就装啥,你可以用碗盛饭,也可以用碗盛汤,那么碗就起到了变量的作用,盛饭就相当于给变量赋值的过程。
有了变量之后,我们要给它起一个好听的名字啊,但这个名字可不是随便起的,想想你爸爸给你起名字的时候是随便起的吗?哈哈哈。
命名规则
- 变量名必须以字母或下划线开始,名字中间只能以字母、数字、下划线组成。比如你起个
123name
、name@1
变量,这些就是不允许的。- 变量名的长度不得超过255个字符。弱弱问一句:谁会取个变量名那么长。
- 变量名在有效的范围内是唯一的。这个有效的范围该怎么理解呢?如果你学到了后面,这个有效范围应该是一个具体的结构中,比如一个函数,后面遇到再说。
- 变量名不能是python中的关键词。那我怎么知道python的关键词有哪些,这个吗……
自己去查,我懒。
一些问题
1.比如下面的例子:
a = 1
b = a
>>id(a)
>>id(b)
猜猜结果是怎样的?结果是:
140710825345680
140710825345680
没想到储存在计算中的地址是一样的,学过C语言的小伙伴应该记得,同样的操作,在C中开辟的两个不同的储存空间,它们的地址是不一样的,python是不是很神奇?感觉类似指针。
再来看看:
a = 1
b = a
>>a
1
>>b
2
# 改变b的值,但a的值不变
b = 2
>>a
1
>>b
2
现在可以明白在python中变量的存储机制了吧,看我的灵魂画手:
也就是说:
当
a = 1
的时候,python解释器创建了一个值为1
的内存,并用变量a
指向这个值的内存。
当
b = a
的时候,并没有建立一个新的内存,变量b
指向跟a
一样的内存。
当
b = 2
时,实际是建立了一个值为2
的内存,并用b
指向它,跟a
分道扬镳了。此时a
还是指向1
。
懂了吗?懂了吗?懂了吗?不懂的小伙伴打电话找我。
2.变量生命周期在不同的结构中也不一样,如果后面的函数、类中我记起来再详细讲讲。
数字
敢问谁不知道数字是什么?不懂的:
数字就是1,2,3,1.34……这些,包括整型和浮点型等等,其他不常用的我就不提了。
整型
整数都应该懂吧,1,2,3,4……没有小数位的都是整型数字。
浮点型
浮点型就是有小数位的数字,像1.2,1.4,4.5……这些。
运算
- 加减乘除
大家好,我是你们小学二年级的老师,现在给你们上数学课。
a = 1
b = 2
# 加法
>>a + b
3
# 减法
>>a - b
-1
# 乘法
>>a * b
2
# 除法
>>a/b
0.5
>>3*(a + b) -3
6
是不是很简单,是不是感觉有辱智商。运算的话在现实中怎么算的怎么来。
- 乘方
乘方运算用两个*
就可以了。
a = 3
b = 4
# a的b次方
>>a**b
81
- 取整
这里的取整可不是数学意义上的取整,这里是一个数除以另一个数,只获得整数部分,抛弃了小数部分。
a = 12
b = 5
# 表示a除以b,只获得整数部分
>>a//b
2
- 取余
余数应该也懂吧,使用%
符号。
a = 12
b = 5
# 取余运算
>>a % b
2
类型转换
有时候我们在计算的时候,需要将整数转换为带小数的浮点型,又或者反过来呢?
-
int()
将一个数转换为整型数字。直接把小数位拿掉,不会考虑四舍五入。
a = 1.2
>>int(a)
1
a = 1.5
>>int(a)
1
-
float()
将一个数转换为浮点类型。
a = 1
>>float(a)
1.0
字符串
概念
字符串就是一连串的字符连接起来的序列,例如:'name'
、'你好'
、"123"
,在python中使用单引号和双引号都可以表示字符串。
那有人就会说,如果一个字符串中我想要有引号怎么办呢?
那么接下来就是字符串的表示问题了。
字符串的表示
- 使用单引号
# 单引号里面可以使用双引号
str1 = 'he is a "lazy" boy'
- 使用双引号
# 双引号里面可以有单引号
str2 = "he is a 'lazy' boy"
- 使用三重引号
str3 = """海阔凭鱼跃,
天高任鸟飞。
"""
发现三重引号有什么不同?当我们的字符串中有很多换行的时候,就可以使用三重引号,它能在我们执行下面的打印操作的时实现换行。
操作
那么接下来就是对字符串的各种骚操作了。
打印
我们会经常会把一些变量打印在屏幕上,这时候这就使用了print()
这个函数,里面放进我们的变量或者字符串都可以。
name = "caibaozhatou"
print (name)
print ("caibaozhatou")
>>caibaozhatou
>>caibaozhatou
当我们亲自操作时总会遇到各种各样的问题,就比如打印上面提到的换行的字符串。
假如我们这样操作:
print ("海阔凭鱼跃,
天高任鸟飞。")
那么打印出的结果为:
SyntaxError: EOL while scanning string literal
报错了吧,这里表示语法错误,在python中,使用双引号时,里面的字符串的换行是不支持的,这时需要用三重引号才可以。
print ("""海阔凭鱼跃,
天高任鸟飞。
""")
>>海阔凭鱼跃,
>>天高任鸟飞。
# 如果上面这样很别扭的话,还可以这样写,反斜杠表示不包括那一行的换行
print ("""\
海阔凭鱼跃,
天高任鸟飞。
""")
>>海阔凭鱼跃,
>>天高任鸟飞。
除了使用三重引号外,还可以使用换行符\n
。
print ("海阔凭鱼跃,\n天高任鸟飞。")
>>海阔凭鱼跃,
>>天高任鸟飞。
\n
是个转义字符,但有时候我们可能会打印有反斜杠的字符串,而不需要有转义的成分,比如打印一个文件地址,这该怎么办呢?绞尽脑汁。
不要灰心,在字符串前面加上r
表示使用原生字符就可以了,原生字符就是里面是啥就是啥,告诉计算机别想那么多。
# 这时候会把\n理解成换行符
print ("C:\name")
>>C:
ame
# 使用原生字符,打印原来字符串的内容
print (r"C:\name")
>>C:\name
格式化字符
前面的打印字符串变量都有一个问题,那就是把字符串都写死了,有时候我们想在一个字符串的某个位置打印出我们想要的东西,这时候就可以使用字符串的格式化处理。
字符串的格式化有两种,一种是使用str.format()
格式化方法,另一种是printf
风格的格式化,其实我个人觉得对于新手用前者比较好,后者有时候难以理解,那么下面主要讲述str.format()
格式化的方法。
- 按位置
# 把要替换的内容用{}替代,然后在format()中按位置放入前面替换的字符串即可
print ("我的名字是{},我今年{}岁。".format("小明", 18))
>>我的名字是小明,我今年18岁。
连接
-
+
号连接
str1 = 'abc'
str2 = 'efg'
str3 = str1 + str2
print (str3)
>>abcefg
# 或者直接在print()中连接
print("abc"+"efg")
>>abcefg
- 隐式连接
如果两个字符串挨在一起,则默认隐式的连接在一起,这对一个很长的字符变量很有用,比如一段很长的字符串写一行很不美观,查看也不方便,就可以拆成几段,分成几行,之间用隐式连接。
text = 'slfjslfjslfjlsjflsjflsjflflcnvkdnsoalanv''sjfslfjsooeiwhfvnblsljaofjojf'
print (text)
>>slfjslfjslfjlsjflsjflsjflflcnvkdnsoalanvsjfslfjsooeiwhfvnblsljaofjojf
print ("slfjslfjslfjlsjflsjflsjflflcnvkdnsoala"
"slfjsooeiwhfvnblsljaofjojf")
>>slfjslfjslfjlsjflsjflsjflflcnvkdnsoalaslfjsooeiwhfvnblsljaofjojf
复制
先来抛出一个问题:
打印0101
这个字符串,这不是很简单吗?
print ('0101')
>>0101
那我要说,如果这个字符串里面有100个01
呢,你打啊!不过学了python之后,就变得很简单了,你只要这样:
print ("01"*100)
>>01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101
把它理解成把前面那个字符串乘以100就很容易了。
字符串变量目前没有复制的操作,你只能创建一个指向同一个字符串的变量,而不能复制出一个一模一样的不同变量出来。
获取长度
直接调用len(str)
函数即可返回某个字符串的长度。
str1 = 'abc'
print (len(str1))
>>3
print (len('abc'))
>>3
单个字符是长度为一的字符串。
索引
字符串是可以被索引查找的,也就是可以通过下标查找,索引值默认从0开始。
str1 = 'abcdefg'
# str1的第三个字符
str1[2]
>>c
# str1的第一个字符
str1[0]
>>a
查找
- in/not in
使用in
来判断某个字符串是否在一个字符串中,存在的话,返回Ture
,反之返回False
。
# 存在
'abc' in 'abcdffea'
>>True
# 不存在
'efg' in 'abcdffea'
>>False
反过来,使用not in
来判断是否不存在,不存在返回True
,存在返回False
。
# 注意区分
'abc' not in 'fjijeid'
>>True
'abc' not in 'fabcsdid'
>>False
-
find()
str1.find(str2, start, end)
用来查找str2
字符串在str1
字符串中的出现的最小索引,也就是说,不管str2
在str1
中存在多少个跟它一样的,只返回第一个出现时的索引,start
和end
参数是对str1
的切片表示,下面讲。
str1 = 'abcdefg'
str2 = 'efg'
str1.find(str2)
>>4
# 切片表示,下面表示从str1的第四个字符到最后一个字符取出来判断
str1.find(str2, 3, 7)
>>4
# 如果找不到怎么办
str3 = 'opq'
str1.find(str3)
>>-1
可见,使用find()
函数,如果查找不到,只能返回-1
,不会报错。
查看了一下官方文档,居然有一个函数,类似上面的find()
函数,不过人家返回的是最大索引,这个函数是rfind()
,用法一样。
-
index()
这个函数用法跟find()
几乎一样,那用什么区别呢?
str1 = '1234512389'
str2 = '123'
str1.index(str2)
>>0
str3 = '456'
str1.index(str3)
没想到,没想到……
ValueError Traceback (most recent call last)
in
1 str1 = '1234512389'
2 str3 = '456'
----> 3 str1.index(str3)
ValueError: substring not found
居然报错了。
index()
就是这样,如果你查找不到,就直接报错,这样会使我们的程序直接停止运行,感觉不是很好。
切片
str1 = '123456789'
# 获取str1第2到第4位之间的字符串
str1[1:3] # 不包括第4位
>>'23'
# 从第1位开始的,前面可以不写
# 获取第1位到第5位
str1[:4]
>>'1234' # 不包括5位
# 获取第6位到最后一位
# 到最后一位的,后面可以不写
str1[5:]
>>'6789'
# 倒着写,最后一位索引是-1
str1[-3:-1]
>>'78' # 并没有包含最后一位,切记
# 获取倒数第3位到最后1位
str1[-3:]
>>'789'
哪里不会切哪里。
移除字符
-
str.strip(chars)
表示在str
的头部和尾部移除chars
里面的字符序列,也就是在两端的字符,只要有chars
出现的字符都要去掉,当chars
为空时,默认移除空白符,即\n
、\r
、\t
、' '
(空格)。
# 1.chars为空值的情况
# 移除空格
str1 = ' name '
str1.strip()
>>'name'
# 移除换行符
str2 = 'name\n'
str2.strip()
>>'name'
# 2.chars不为空的情况
str1 = 'abcdefg'
# 注意字符a在开头,移除a
str1.strip('a')
>>'bcdefg'
# 试一下移除字符c
str1.strip('c')
>>'abcdefg' # 没有用,因为c不在头部或尾部
# 移除字符序列
str3 = 'abcgeafab'
str3.strip('abc')
>>'geaf' # 这里注意,头尾凡是有'a'、'b'、'c'当中的任意一个字符,都将去除。
所以得出结论:str.strip()
函数最常用于去除空白字符,特别是换行符和空格,这在爬虫中很有用。
替换
str.replace(old, new,count)
表示在字符串str
中出现的所有old
字符串用new
字符串替换,其中参数count
表示只替换前count
次出现的old
字符串。
# ab出现了3次
str1 = 'abcslfieslabseab'
# 将ab替换成ef
str1.replace('ab', 'ef')
>>'efcslfieslefseef'
# 只替换前两个ab
str1.replace('ab', 'ef', 2)
>>'efcslfieslefseab'
有时候我们就想啊,怎么把一个字符串中一个小的字符串都去除掉。
想啊~
想啊~
想~
把new
字符串设置为空不就行了?
str1 = 'abcslfieslabseab'
# 去除所有的'abc'字符串
str1.replace('abc', '')
>>'bcgefb'
写在后面
想要学习更多的的python相关知识,除了查看其他人的相关文章之外,还可以看看官方文档,毕竟官方文档才是爸爸,在此贴出(中文)官方网址:https://docs.python.org/zh-cn/3/index.html
还有就是,坚持写文刷钻,坚持坚持!