基础篇_004_基本数据类型_几种重要函数的整理
有些函数中会有一个参数叫:self,这个大家可以先不管他,可以将它自动无视掉。
----数字(整型、浮点数、复数):
1. int(value, base = ):将value以base进制转换成数字,base的默认值为10。
2. value.bit_length():返回value的二进制的有效位的长度。eg:3的二级制为0011,则3.bit_length() = 2,相当于返回以2为底value的对数的整数部分。
3. float():转换成小数。
4. 有时有字符串转换的时候很难判断是小数还是整数,所以Python解决了这个问题:eval(value)——表面上使用的时候:函数内部自动判断是小数还是整数。深层意义:评估(evaluate),就是将字符串的最外层引号去掉,然后将其中的内容解释成Python语句。
5. complex(real, imag):创建一个复数,参数的类型都是float类型。
6. conjugate():返回complex类型的对象,产生共轭复数。
----字符串(很多很多,一般人背不完,不过大家可以自己写一个blog或者是推送记录一下,然后再用Pycharm试一试):
1. capitalize():将首字母大写。
2. casefold()和lowwer():都能将字符串改成小写,但是casefold()更厉害,它能将其他非英语的字符转换成小写。eg:德文的“ß”转换成“ss”,但是lowwer()就不会转换,所以在Unicode编码下经常使用casefold()方法,因为它包含了所有情况。
--有小写就一定会有大写 ===》upper():将字符串中所有的字符转换成大写。
--这样就有了大小转换的函数——swapcase():大写转成小写小写转成大写。
3. center(width, fillchar = None):将被调用字符串对象在长度为width内居中显示(若字符串对象的长度 > width,则输出原字符串),空余部分用fillchar(默认值为“空格”,要注意的是:此处只能填写一个字符!!!)来填充,并且遵循后面的fillchar的数量 ≥ 前面的fillchar的数量。eg:"sss".center(6, "*")的输出结果为:*sss**;若将6改成7,则输出的结果为:**sss**。
有了center就当然会有left和right了 ===》ljust()居左显示、rjust()居右显示,用法和center一模一样。
4. count(substring, strat = None, end = None):返回被调用字符串对象中,从索引start位置到索引end位置上有多少个substring子序列(左闭右开),默认的范围为整个字符串。
5. encode()和decode()——暂时先放着,以后再说。
6. startwith(substring)和endwith(substring):返回值为布尔值,判断字符串是否以substring开始或结束。
7. find(substring, start = None, end = None):返回值为int类型,在被调用字符串中寻找第一个substring的索引位置,寻找范围是:[ start, end ),默认是整个字符串。
--这里还有一个与find()类似的函数:index()。他俩的区别就是:如果在字符串中没有找到子字符串,find()函数将返回-1;index()函数将抛出异常 ===》所以这里建议大家用find()函数。
8. format():格式化字符串,有两种替换方式,一种占位符有名称,一种没有,但是占位符都要用{}括起来 ===》
--方法一:占位符有变量名,替换规则为:参数名称与占位符名称对应替换。eg:
1 # 定义一个字符串,其中包含两个占位符:name和adj
2 my_string = "My name is {name}, and I'm a {adj} men."
3 # 定义两个将要传入的占位符的值
4 my_name = "SimbaWang"
5 my_adj = "handsome"
6 # 输出、不做任何处理的原字符串
7 print(my_string) # 输出结果为:My name is {name}, and I'm a {adj} men.
8 # 1. 将原字符串格式化
9 my_string_format = my_string.format(name = my_name, adj = my_adj)
10 print(my_string_format) #输出结果为:My name is SimbaWang, and I'm a handsome men.
11 # 大家可以注意到:没有加上{}的name并没有被当成占位符替换掉! ===》
12 # 所以想要替换掉某一个值,就必须加上{},以表明这是占位符!
13 # 2. 如果说,觉得非要传入一个字典不可,那也不是不行
14 my_string_format = my_string.format(**{"name": my_name, "adj": my_adj})
15 print(my_string_format) # 输出:My name is SimbaWang, and I'm a handsome men.
16 # 3. 如果希望以列表或者元组的方式传入,则要加上*,道理与上面类似,
17 # 不是传入一整个列表或者元组,而是要将列表转换成一个元组(若为元组,直接遍历),然后拆开遍历
18 my_string = "My name is {}, hahaha{}"
19 my_string_format = my_string.format(*[1, 3])
20 print(my_string_format)
"**"和"*"的开头:既然提到了它,那就开一个小头。"**"和"*"除了有乘方和乘法的意思,在函数中还有其他的意思。
--*args(positional argument位置参数) 与 **kwargs(keyword argument关键词参数) 的区别,两者都是 python 中的可变参数:
1. *args : 表示任何多个无名参数,它本质是一个 tuple
2. **kwargs: 表示关键字参数,它本质上是一个 dict
所以在这里,传入字典需在前面加上"**"、列表或元组前加上"*",如果很懵,属正常现象,因为这个是函数中涉及到的知识点。
"基础篇_010_函数_粗略梗概"中的第5点:参数组
--方法二:占位符没有名称,用数字表示,替换规则为:参数的顺序由0开始依次递增,占位符的顺序由所填入的数字决定,可以重复,然后占位符数字与参数的顺序相匹配,替换成功。eg:
1 # 定义一个字符串,包含两个占位符:0 和 1
2 my_string = "My name is {0}, and I'm a {1} man."
3 # 将字符串格式化
4 my_string_format = my_string.format("SimbaWang", "handsome")
5 # 输出格式化后的字符串
6 print(my_string_format) # 输出的结果为:My name is SimbaWang, and I'm a handsome man.
9. format_map():这个虽然也是格式化,但是传入参数的格式不同,这个函数的格式为:{"占位符名称": 值, .....}({}千万不要漏了!!1),这个是用“字典”(键值对)来完成替换的,“字典”数据类型我们后面再谈,这里清楚这个函数的用法就行。eg:
1 # 定义一个字符串,包含两个占位符:name 和 adj
2 my_string = "My name is {name}, and I'm a {adj} man."
3 # 将字符串格式化
4 my_string_format_map = my_string.format_map({"name": "SimbaWang", "adj": "handsome"})
5 # 输出格式化后的字符串
6 print(my_string_format_map) # 输出的结果为:My name is SimbaWang, and I'm a handsome man.
10. isalnum():判断字符串中是否只是含有“字母”(alphabet,汉字也算)或者“数字”(number)。这里还有一些,比如isalpha()判断是否只含有字母、isspace()判断是否只含有空格......
11. title():将字符串转换为标题样式的格式。标题样式就是有且仅有所有单词的首字母大写,一切标点符号算作单词与单词之间的分隔符,包括('):“My Name Is Simbawang, And I Am A Handsome Man.”
12. istitle():判断是否是标题样式的字符串。
13. isdecimal()、isdigit()和isnumeric()判断是否是数字:越往后越厉害,isdecimal()只能判断字符串是否是单纯的数字(阿拉伯数字),isdigit()可以判断是否是数字(eg:٦——阿拉伯文6,⑥......但是不能表示中文),而isnumeric()能判断中文的数字。
14. isidentifier():判断字符串是否符合标识符(identifier)的规则。
15. isprintable():咋一看以为这是判断字符串是否能打印出来的,然后感觉有点儿不对劲,到底啥字符串不可以被打印呢,嗯?俗话说得好:实践出真知。得出结论:可否打印是指能否将字符串中的所有字符原样输出 ===》eg:
1 # 定义2个字符串,一个有'\t',一个没有
2 my_string_right = "asdfasdf"
3 my_string_wrong = "adsfads\tasdf"
4 # 保存2个字符串是否可打印的结果
5 result_right = my_string_right.isprintable()
6 result_wrong = my_string_wrong.isprintable()
7 # 输出2个字符串以及是否可打印的结果
8 print(my_string_right+ ":" + str(result_right)) # 输出结果为:asdfasdf:True
9 print(my_string_wrong+ ":" + str(result_wrong)) # 输出结果为:adsfads asdf:False
16. split_string.join(destination_string):先将destination_string一个字符一个字符地分割,然后将split_string插入destination_string中。
17. expandtabs():Python给出的解释为:Return a copy where all tab characters are expanded using spaces.就是将所有的tab(\t)换成空格,但是究竟是怎样一个换法呢?===》
--这里Python并没有给出具体的规则,经过“欣赏”一些大佬的精文加上自己的实践得出:Python首先将调用的字符串从左到右、按照参数指定的大小分割(默认为8),如果在某格中遇到\t则停下、替换成空格将这一格填满至指定参数的大小长,然后继续向后重新分割。
--那大家会问:这个东西到底有什么实质性的作用呢?===》
--这个东西还是有点儿作用的,不知道大家有没有做过成绩管理系统,在将所有人的信息显示出来的时候,我们经常会遇到一些麻烦,就是对不齐,这样就需要尝试用最少的\t来使之对齐,就很麻烦,那么用这个函数就能简简单单的解决问题了!
18. string.strip(strip_string):从两端开始将string中的每一个字符与strip_string的每一个字符匹配,如果strip_string中包含这些字符(string两端的字符),则将这些字符去掉,继续匹配直到不包含为止,strip_string默认为:空格、'\t'、'\n'。lstrip():从左端开始、rstrip():从右端开始。eg:
1 # 定义被忽略字符串
2 my_string = "asdf asdfaasdsdfa sddsdff"
3 # 定义匹配字符串
4 my_string_strip = "fadsdfasdfasdfdfdsd"
5 # 查找匹配......
6 result = my_string.strip(my_string_strip)
7 # 输出结果
8 print(result)
9 # 输出结果: asdfaasdsdfa (两端都有空格,证明了:只要遇到my_string_strip没有的字符就终止,两端互不影响)
19. maketrans()和translate()连用:按照字符一一对应的规则翻译字符串,maketrans():创建一对对应规则、translate():开始翻译。eg:
1 # Z——L、R——S、C——I
2 my_string_coder = "ZRC" # 相当于原码
3 my_string_decoder = "LSI" # Leader of Simultaneous Interpretation 相当于译码
4 m1 = str.maketrans(my_string_coder, my_string_decoder)
5 my_string_original = "ZasdRghCgagZ" # 一篇文章,原文
6 result = my_string_original.translate(m1) # 开始翻译
7 print(result) # 输出结果为:LasdSghIgagL
20. partition(partition_string)和split(split_string):都是对调用函数的字符串以参数作为分隔符进行分割,区别是:partition()只能分割一次,获得前字符串、分隔符、后字符串,返回一个元组;split()能指定分割次数,默认为全部分割,但是不能获取分隔符,返回一个列表。eg:
1 # 不写注释了,大家应该都看得懂叭!
2 my_string = "adsfasdfasdfasdf"
3 my_string_partition = "s"
4 my_string_split = "s"
5 result_partition = my_string.partition(my_string_partition)
6 result_split = my_string.split(my_string_split)
7 print("partition:", result_partition) # 输出结果: partition:('ad', 's', 'fasdfasdfasdf')
8 print("split:", result_split) # 输出结果:split: ['ad', 'fa', 'dfa', 'dfa', 'df']
9 # 更改split()函数中的参数,让my_string只被分割两次(产生3个字符串)
10 result_split = my_string.split(my_string_split,2)
11 print("new_split:", result_split) # 输出结果:new_split:['ad', 'fa', 'dfasdfasdf']
--当然,除了从左向右进行分割,还有从右向左进行分割:rpartition(partition_string)和rsplit(split_string)。
--这两种分割方法各有千秋,但是还有这两方法的集大成者:正则表达式——以后再详细介绍,这个能既能选择分割次数,又能选择是否保存分隔符。
21. splitlines(my_boolean = False):这是一个特殊的分割函数,它只会分割换行符,并且最后一个换行符不做分割,参数是用户用来选择分割时是否在每一段末尾保留'\n'。eg:
my_string = "asdfadsf\nzcxvzxcv\nqwerqewr\n"
result_false = my_string.splitlines()
result_true = my_string.splitlines(True)
print("默认的false ===》",result_false) # 输出结果:默认的false ===》 ['asdfadsf', 'zcxvzxcv', 'qwerqewr']
print("true ===》",result_true ) # 输出结果:true ===》 ['asdfadsf\n', 'zcxvzxcv\n', 'qwerqewr\n']
----保留小数的4种方法 ===》
1 #测试保留小数的4种方法
2 test = 123.50
3 # 方法一:"%.nf" % digit ===》n:需要保留多少为的小数。
4 format_test = "%.2f" % test
5 print(format_test) # 输出:123.50
6 # 方法二:format(test, ".nf") ===》n:需要保留多少为的小数。
7 # 与上一种方法不同的是,字符串中不需要加上"%",并且使用的是Python的内置函数
8 format_test = format(test, ".2f")
9 print(format_test) # 输出:123.50
10 # 方法三:用str类型的format()函数 (不建议使用:因为它不能完成四舍五入,它做的操作是截断)
11 # "{:.nf}".format(test) ===》n:需要保留多少为的小数;前面必须加上":."
12 format_test = "{:.2f}".format(test)
13 print(format_test) # 输出:123.50
14 # 方法四:round(test, n) ===》n:需要保留多少为的小数。
15 # 但是和前三种不同,当位数多余时,不会补0
16 format_test = round(test, 2)
17 print(format_test) # 输出:123.5
--所以,如果大家只是单纯的想四舍五入的话,这里建议大家用前两种方法,特别是第二种Python的内置函数format(),不仅长得好看,还能顺走一个内置函数。
--但是如果涉及到浮点数之间的比较可以试着运用round()函数,这里大家可能会有疑惑:为什么比较需要保留小数呢?这里就涉及到一个计算机中普遍存在的问题——"小数的保存(精度)" ===》print(0.1 + 0.2 == 0.3) # 输出的结果为:False
在计算机中所有数字都是采用二进制来表示,在Python中使用一个53位的二进制来表示一个小数的小数部分,但是在小数部分上二进制与十进制不存在严格的对等关系,所以有一些小数用无限的二进制来表示,但是由于只能取前53位,就只能无限的接近此小数的真实值了 ===》
浮点数的运算存在不确定的尾数。
好在产生这种不确定尾数只存在于小数点后第16位,所以可以通过截取近似来比较。
----未完待续