Loading

弱类型语言的含义-注释-变量-字符串-命名


返回 我的技术栈(Technology Stack)



Python是一门弱类型语言,弱类型包含两个方面的含义:
  • 变量无需声明即可直接赋值:所有的变量无需声明即可使用(对从未用过的变量赋值就是声明了该变量)
  • 变量的数据类型可以动态改变:变量的数据类型可以随时改变(同一个变量可以一会儿是数字型,一会儿字符串型)

单行注释和多行注释


合理的代码注释应该占源代码的1/3左右

【1】单行注释:
print("这是单行注释")     #  这是单行注释



【2】多行注释:

'''
三个单引号的多行注释
'''

"""
三个双引号的多行注释
"""

变量


常量与变量的区别:

常量  一旦保存了某个数据之后,该数据就不能发生改变;

变量  保存的数据则可以多次发生改变,只要程序对变量重新赋值即可。

【1】print()输出函数:

print(value,...,sep = ' ',end = '\n',file = sys.stdout,flush = False)

使用 print()函数输出多个变量时,print()函数  默认以空格隔开多个变量,如果改变默认的分隔符,可以通过 sep 参数设置

print("读者姓名:", user_name, "年龄:", user_age, sep = "|")

读者姓名:| XXX | 年龄:| 8

print()函数 输出换行,原因是有一个end参数默认值为“\n”

print(40,'\t',end="")
print(80,'\t',end="")
print(100,'\t',end="")

40  80  100

file参数指定print()语句的输出目标,file 参数默认值为sys.stdout,该默认值代表系统标准输出,也就是输出到屏幕,因此print()函数默认输出到屏幕。

实际上,可以通过修改该参数让print()函数输出到特定的文件中

f = open("poem.txt","w") # 打开文件以便写入

print("沧海一粟", file = f)

f.close()

print()函数的flush参数用于控制输出缓存,该参数一般保持False即可,这样可以获得较好的性能

【2】变量名的命名规则:

(1)变量命名可以使用字母(不局限于26个英文字母,可以包含中文字符、日文字符等)、数字、下划线。但是不能以数字开头;不能是Python关键字、但是可以包含关键字;不能包含空格

Python2.x对中文支持较差,如果要在Python2.x中使用中文字符集或中文变量,需要在源代码第一行加入  # coding: utf-8, 同时将原文件保存为UTF-8字符集【在Python2.x中,print 是关键字而不是函数】

如果使用关键字作为变量名,会报错!

如果使用内置函数作为变量名,不会报错!但是内置函数就会被这个变量覆盖了,该内置函数就不能使用了!

(2)严格区分大小写:abc与ABC截然不同

数值类型


【1】整型
a = None
print(a)
print(type(a))

a = 56
print(a)
print(type(a))

a = 9999999999999999999999999999999
print(a)
print(type(a))

输出:
None
<class 'NoneType'>
56
<class 'int'>
9999999999999999999999999999999
<class 'int'>



# 但是Python2.x时候
a = 9999999999999999999999999999999
print(a)
print(type(a))

输出:
9999999999999999999999999999999
<class 'long'>

Python的整型数值有四种表示形式:

十进制:一般使用的整数

二进制:以     0B或0b    开头

八进制:以     0O或0o    开头

十六进制:以 0X或0x    开头【10-15分别以a~f来表示】

# 以0x或0X开头的整数数值是十六进制的整数
hex_value1 = 0x13
hex_value2 = 0XaF
print("hex_value1的值为:", hex_value1)
print("hex_value2的值为:", hex_value2)
# 以0b或0B开头的整数数值是二进制的整数
bin_val = 0b111
print('bin_val的值为:', bin_val)
bin_val = 0B101
print('bin_val的值为:', bin_val)
# 以0o或0O开头的整数数值是八进制的整数
oct_val = 0o54
print('oct_val的值为:', oct_val)
oct_val = 0O17
print('oct_val的值为:', oct_val)
# 在数值中使用下画线     【Python3.x允许为数值(包括浮点型)增加下画线为分隔符,这些下画线不会影响数值本身。Python2.x不支持数值中使用下画线!】
one_million = 1_000_000
print(one_million)
price = 234_234_234  # price实际的值为234234234
android = 1234_1234  # android实际的值为12341234

输出:
hex_value1的值为: 19
hex_value2的值为: 175
bin_val的值为: 7
bin_val的值为: 5
oct_val的值为: 44
oct_val的值为: 15
1000000

【2】浮点型

浮点型数值用于保存带小数点的数值

Python的浮点数的两种表示形式:

(1)十进制形式:平常简单的浮点数。例如5.12,    7.2,    2.0等【注意:浮点数必须包含一个小数点,否则会被当成整数类型处理】

(2)科学计数形式:例如5.12e2(即5.12 X 10^2)、5.12E2(即5.12 X 10^2)
【切记:只有浮点型数值才可以使用科学计数形式表示,科学计数形式会被自动转为浮点型,例如51200是一个整型值,但是512E2是一个浮点型值】

af1 = 5.2345556
# 输出af1的值
print("af1的值为:", af1)
af2 = 25.2345
print("af2的类型为:", type(af2))
f1 = 5.12e2
print("f1的值为:", f1)
f2 = 5e3
print("f2的值为:", f2)
print("f2的类型为:", type(f2))  # 看到类型为float

输出:
af1的值为: 5.2345556
af2的类型为: <class 'float'>
f1的值为: 512.0
f2的值为: 5000.0
f2的类型为: <class 'float'>

【3】复数

复数的虚部用    j    或    J    来表示

需要导入 cmatch模块(c代表complex)

ac1 = 3 + 0.2j
print(ac1)
print(type(ac1))  # 输出 complex类型
ac2 = 4 - 0.1j
print(ac2)
# 复数运行
print(ac1 + ac2)  # 输出 (7+0.1j)

# 导入cmatch模块
import cmath
# sqrt()是cmath模块下的函数,用于计算平方根
ac3 = cmath.sqrt(-1)
print(ac3)  # 输出 1j

输出:
(3+0.2j)
<class 'complex'>
(4-0.1j)
(7+0.1j)
1j

字符串入门


提示:Python3.x对中文字符支持比较好,但是Python2.x则需要在源代码中增加 "#coding:utf-8 "才能支持中文字符

字符串和转义字符

对于字符串本身包含单引号或双引号的解决方案:

  • 【1】使用不同的引号将字符串括起来:

    如果字符串内容中包含了单引号,则可以使用双引号

    如果字符串内容中包含了双引号,则可以使用单引号

    总结口令:含单用双;含双用单

      str1 = "I'm a coder"
      str2 = 'he said:"you are a boy?"'
    
  • 【2】使用转义字符:

    反斜线( \ )

      str1 = 'he said: "I\'m a coder"'
    

    其他转义字符:

    \b 退格符
    \n 换行符
    \r 回车符
    \t 制表符
    '' 双引号
    ' 单引号
    \ 反斜线

拼接字符串

s1 = "hello,"   "word"
print(s1)
输出:【注意:两个字符串紧挨写在一起,Python会自动拼接他们,但是并不能真正用于字符串拼接,正确应该用加号(+)拼接】
hello,word

s1 = "hello,"   
s2 = "word"
print(s1+s2)
输出:
hello,word

repr和字符串

Python不可以直接拼接数值和字符串,必须先将数值转为字符串

s1 = "这本书的价格是:"
p = 99.8

字符串直接拼接数值,程序报错
print(s1 + p)  # 报错!!!
# 函数1:使用str()将  数值---->字符串
print(s1 + str(p))
# 函数2:使用repr()将 数值---->字符串
print(s1 + repr(p))


repr()还有一个功能,就是他会以Python表达式的形式来表示值,即用单引号括起来,再输出

st = "I will play my fife"
print(st)
print(repr(st)) 


输出:
这本书的价格是:99.8
这本书的价格是:99.8

I will play my fife
'I will play my fife'   #【这就是字符串的Python的表达式形式】

input和raw_input

input():函数总会将输入的内容放入    字符串    中

Python3.x
msg = input("请输入你的值:")
print(type(msg))
print(msg)

输出:
请输入你的值:2.3
<class 'str'>
2.3

请输入你的值:2.3 4.5 3
<class 'str'>
2.3 4.5 3

raw_input():Python2.x提供的,相当于Python3.x的input()。

  • Python2.x也有input()但是输入    字符串    时候必须使用引号将字符串括起来,否则报错!

  • 另外,Python2.x的input会判别输入的对应的值的类型

      Python2.x
      msg = input("请输入你的值:")
      print(type(msg))
      print(msg)
      
      输出:
      请输入你的值:2.3
      <class 'float'>
      2.3
    

长字符串

当有大段字符串(内容又包含单引号或双引号时),推荐使用长字符串形式,赋值给变量【不赋值就单纯注释了】

s = '''"Let's go fishing", said Mary.
"OK, Let's go", said her brother.
they walked to a lake'''
print(s)
print("#" * 10)

【使用换行符进行转义,转义后的换行符不会“中断”字符串!!!】
s2 = 'The quick brown fox \
jumps over the lazy dog'
print(s2)
print("#" * 10)

【对表达式换行,必须使用转义字符(\)!!!】
num = 20 + 3 / 4 + \
      2 * 3
print(num)

输出:
"Let's go fishing", said Mary.
"OK, Let's go", said her brother.
they walked to a lake
##########
The quick brown fox jumps over the lazy dog
##########
26.75

原始字符串

原始字符串以    “ r ”    开头,原始字符串不会把反斜线当成特殊字符

s11 = 'G:\\publish\\codes\\02\\2.4'  # 不是原始字符串表示时,需要使用转义字符
s12 = r'G:\publish\codes\02\2.4'  # 使用原始字符串形式
print(s11)
print(s12)

输出:
G:\publish\codes\02\2.4
G:\publish\codes\02\2.4


# 原始字符串包含的引号,同样需要转义,但此时用于转义的反斜线会变成字符串的一部分
s2 = r'"Let\'s go", said Charlie'
print(s2)
 # 由于原始字符串中的反斜线会对引号进行转义,因此原始字符串的结尾处不能是反斜线,否则字符串的结尾处的引号就被转义了,这样就导致字符串不能正常结束。解决方案如下
s3 = r'Good Morning' '\\'
print(s3)
s3 = r'Good Morning' '\\'
print(s3)
s4 = """Good Morning\ """   # 最后面空开一空格,连在一块还是会被转义,导致报错!
print(s4)

输出:
"Let\'s go", said Charlie
Good Morning\
Good Morning\

字节串(bytes)

字符串(str)由多个字符组成,以字符为操作单位

字节串(bytes)由多个字节组成,以字节为操作单位

计算机底层:

位(bit)                代表1位,要么是1,要么是0

字节(Byte)        代表1字节,1字节包含8位

# 创建一个空的bytes
b1 = bytes()
# 创建一个空的bytes值
b2 = b''
# 通过b前缀指定hello是bytes类型的值
b3 = b'hello'
print(b3)
print(b3[0])
print(b3[2:4])
print()

# 调用bytes方法将字符串转成bytes对象
b4 = bytes('我爱Python编程', encoding='utf-8')
print(b4)
# 利用字符串的encode()方法编码成bytes,默认使用utf-8字符集
b5 = "学习Python很有趣".encode('utf-8')
print(b5)
print()

# 将bytes对象解码成字符串,默认使用utf-8进行解码。
st = b5.decode('utf-8')
print(st)  # 学习Python很有趣

输出:
b'hello'
104
b'll'

b'\xe6\x88\x91\xe7\x88\xb1Python\xe7\xbc\x96\xe7\xa8\x8b'
b'\xe5\xad\xa6\xe4\xb9\xa0Python\xe5\xbe\x88\xe6\x9c\x89\xe8\xb6\xa3'

学习Python很有趣

字符串格式化

price = 108
print("the book's price is %x" % price)  # the book's price is 6c
user = "Charli"
age = 8
# 格式化字符串有两个占位符,第三部分提供2个变量
print("%s is a %s years old boy" % (user, age))  # Charli is a 8 years old boy
num = -28  【指定了字符串的最小宽度为6,因此程序转换数值的时候总宽度为6,不够在前面自动补充空格,这里补充了三个空格】
print("num is: %6i" % num) # num is:    -28
print("num is: %6d" % num) # num is:    -28
print("num is: %6o" % num) # num is:    -34
print("num is: %6x" % num) # num is:    -1c
print("num is: %6X" % num) # num is:    -1C
print("num is: %6s" % num) # num is:    -28
num2 = 30
# 最小宽度为6,左边补0
print("num2 is: %06d" % num2) # num2 is: 000030


# 最小宽度为6,左边补0,总带上符号
【(+)表示数值总要带着符号,正数带“+”,负数带“-”    (0)表示不补充空格,而是补充0】
print("num2 is: %+06d" % num2) # num2 is: +00030
# 最小宽度为6,右对齐
【右对齐由(-)符号表示】
print("num2 is: %-6d" % num2) # num2 is: 30 


my_value = 3.001415926535
# 最小宽度为8,小数点后保留3位
print("my_value is: %8.3f" % my_value)   # my_value is:    3.001
# 最小宽度为8,小数点后保留3位,左边补0
print("my_value is: %08.3f" % my_value)  # my_value is: 0003.001
# 最小宽度为8,小数点后保留3位,左边补0,始终带符号
print("my_value is: %+08.3f" % my_value) # my_value is: +003.001


the_name = "Charlie"
# 只保留3个字符
print("the name is: %.3s" % the_name)    # the name is: Cha
# 只保留2个字符,最小宽度10
print("the name is: %10.2s" % the_name)  # the name is:         Ch







c r a z y i t . o r g   i s   v e r y   g o o d
0 1 2 3 4 5 6 7 8 9 ...........................
.........................................  -2 -1

s = 'crazyit.org is very good'
# 获取s中索引2处的字符
print(s[2])  # 输出a
# 获取s中从右边开始,索引4处的字符
print(s[-4])  # 输出g
# 获取s中从索引3处到索引5处(不包含)的子串
print(s[3: 5])  # 输出zy
# 获取s中从索引3处到倒数第5个字符的子串
print(s[3: -5])  # 输出zyit.org is very
# 获取s中从倒数第6个字符到倒数第3个字符的子串
print(s[-6: -3])  # 输出y g
# 获取s中从索引5处到结束的子串
print(s[5:])  # 输出it.org is very good
# 获取s中从倒数第6个字符到结束的子串
print(s[-6:])  # 输出y good
# 获取s中从开始到索引5处的子串
print(s[: 5])  # 输出crazy
# 获取s中从开始到倒数第6个字符的子串
print(s[: -6])  # 输出crazyit.org is ver
# 判断s是否包含'very'子串
print('very' in s)  # True
print('fkit' in s)  # False
# 输出s的长度
print(len(s))  # 24
# 输出'test'的长度
print(len('test'))  # 4
# 输出s字符串中最大的字符
print(max(s))  # z
# 输出s字符串中最小的字符
print(min(s))  # 空格

字符串大小写,删除空白

a = 'our domain is crazyit.org'
# 每个单词首字母大写
print(a.title())
# 每个单词小写
print(a.lower())
# 每个单词大写
print(a.upper())

print(a.swapcase()) # 翻转string中的大小写
print(a.capitalize()) # 把字符串的第一个字符大写

输出:
Our Domain Is Crazyit.Org
our domain is crazyit.org
OUR DOMAIN IS CRAZYIT.ORG
s = '  this is a puppy  '
# 删除左边的空白
print(s.lstrip())
# 删除右边的空白
print(s.rstrip())
# 删除两边的空白
print(s.strip())
# 再次输出s,将会看到s并没有改变
print(s)

输出:
this is a puppy  
  this is a puppy
this is a puppy
  this is a puppy 

    
s2 = 'i think it is a scarecrow'
# 删除左边的i、t、o、w字符
print(s2.lstrip('itow'))
# 删除右边的i、t、o、w字符
print(s2.rstrip('itow'))
# 删除两边的i、t、o、w字符
print(s2.strip('itow'))

输出:
 think it is a scarecrow
i think it is a scarecr
 think it is a scarecr

查找、替换相关方法

startswith():判断字符串是否以指定子串开头

endswith():判断字符串是否以指定子串结尾

find():查找指定子串在字符串中出现的位置,如果没有找到指定子串,则返回-1

rfind():类似find(),不过是从右边开始查找

index():查找指定子串在字符串中出现的位置,如果没有找到指定子串,则引ValueError错误

rindex():类似index(),不过是从右边开始

replace():使用指定子串替换字符串中的目标子串

string.replace(old_str, new_str, num=string.count(old)),把 string 中的 old_str 替换成 new_str,如果 num 指定,则替换不超过 num 次

translate():使用指定的翻译映射表对字符串执行替换

s = 'crazyit.org is a good site'
# 判断s是否以crazyit开头
print(s.startswith('crazyit')) # True
# 判断s是否以site结尾
print(s.endswith('site')) # True
print(s.endswith('te')) # True
# 查找s中'org'的出现位置
print(s.find('org'))  # 8
# 查找s中'org'的出现位置
print(s.index('org'))  # 8
# 从索引为9处开始查找'org'的出现位置
print(s.find('org', 9)) # -1
# 从索引为9处开始查找'org'的出现位置
print(s.index('org', 9))  # 引发错误
# 将字符串中所有it替换成xxxx
print(s.replace('it', 'xxxx')) # crazyxxxx.org is a good sxxxxe
# 将字符串中1个it替换成xxxx
print(s.replace('it', 'xxxx', 1)) # crazyxxxx.org is a good site
# 定义替换表:97(a)->945(α),98(b)->945(β),116(t)->964(τ),
table = {97: 945, 98: 946, 116: 964}   制作映射表的方法可以使用str的maketrans()方法----->str.maketrans("abc","123")===>{97:49, 98:50, 99:51}
print(s.translate(table))  # crαzyiτ.org is α good siτe 【这里的某些字符时无法正常显示,被替换了,换了部分字符集的映射】

分割、连接方法

split():将字符串按照指定的分割符分割成多个短语

join():将多个短语连接成字符串

s = 'crazyit.org is a good site'
# 使用空白对字符串进行分割
print(s.split()) # 输出 ['crazyit.org', 'is', 'a', 'good', 'site']
# 使用空白对字符串进行分割,最多只分割前2个单词
print(s.split(None, 2)) # 输出 ['crazyit.org', 'is', 'a good site']

# 使用点进行分割
print(s.split('.')) # 输出 ['crazyit', 'org is a good site']

mylist = s.split()
# 使用'/'为分割符,将mylist连接成字符串
print('/'.join(mylist)) # 输出 crazyit.org/is/a/good/site
# 使用','为分割符,将mylist连接成字符串
print(','.join(mylist)) # 输出 crazyit.org,is,a,good,site


使用 “.” 对字符串进行分割,最多只分割前3个单词
s = 'crazyit.org i.s a g.ood site'
print(s.split('.', 3)) # ['crazyit', 'org i', 's a g', 'ood site']

判断方法

方法 说明
string.isspace() 如果 string 中只包含空格,则返回 True
string.isalnum() 检测字符串是否由字母和数字组成。如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True
string.isalpha() 如果 string 至少有一个字符并且所有字符都是字母则返回 True
string.isdecimal() 如果 string 只包含数字则返回 True,全角数字
string.isdigit() 如果 string 只包含数字则返回 True,全角数字、⑴、\u00b2
string.isnumeric() 如果 string 只包含数字则返回 True,全角数字,汉字数字
string.istitle() 如果 string 是标题化的(每个单词的首字母大写)则返回 True
string.islower() 如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True
string.isupper() 如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True

文本对齐

方法 说明
string.ljust(width) 返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串
string.rjust(width) 返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串
string.center(width) 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串

拆分与连接

方法 说明
string.partition(str) 把字符串 string 分成一个 3 元素的元组 (str前面, str, str后面)
string.rpartition(str) 类似于 partition() 方法,不过是从右边开始查找
string.split(str="", num) 以 str 为分隔符拆分 string,如果 num 有指定值,则仅分隔 num + 1 个子字符串,str 默认包含 '\r', '\t', '\n' 和空格
string.splitlines() 按照行('\r', '\n', '\r\n')分隔,返回一个包含各行作为元素的列表
string.join(seq) 以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串

推荐使用下划线命名



posted @ 2021-03-28 13:01  言非  阅读(315)  评论(0编辑  收藏  举报