内置函数int,可以将float、全是数字的字符串转换成int类型的数据,为了降低难度,这个练习题只要求你实现其中的一种功能,将全是数字组成的字符串转换成int类型数据,例如将字符此案“123”转换成整数123,函数定义如下:
def my_int(string):
"""
将字符串string转成int类型数据
不考虑string的类型,默认就是符合要求的字符串
传⼊字符串"432"
返回整数432
:param string:
:return:
"""
pass
代码:
str_int_dic = { '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9 }
def my_int(string):
res = 0
for item in string:
int_value = str_int_dic[item]
res = res*10 + int_value
return res
思路:
遍历字符串,将每个字符串里的每个字符传换成int类型的数值,这个过程可以使用字典来完成,建立一个字典,字符串的数字做key,int类型的数字做value,例如下面的字典
str_int_dic = { '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9 }
得到数字后,还得考虑这个数字是哪一位的,是千位还是百位,这里可以使用一个技巧,遍历的过程都是从左向右进行的,设置一个变量保存转换后的int数据,初始值赋为0,每一次循环后,都用这个变量乘10再加上所遍历的数值,这样就巧妙地解决了位数问题。
内置函数str的功能非常强大,想要模仿实现一个相同功能的函数是非常困难的,因此本练习题只要求将int类型的数据转换成字符串,实现下面的函数:
def my_str(int_value):
"""
将int_value转换成字符串
:param int_value:
:return:
"""
pass
代码:
def my_str(int_value):
if int_value == 0:
return '0'
lst = []
is_positive = True #标记是否是负数
if int_value < 0:
is_positive = False
int_value = abs(int_value)
while int_value:
number = int_value % 10
int_value //= 10
str_number = chr(number + 48)
lst.append(str_number)
if not is_positive:
lst.append('-')
lst = lst[::-1] #倒序输出
return ''.join(lst)
代码详解:
if int_value == 0:
return '0'首先,函数检查输入的整数是否为0。如果是0,那么函数直接返回字符串`'0'`,表示整数0的字符串形式。
lst = []
is_positive = True
if int_value < 0:
is_positive = False
int_value = abs(int_value)接下来,函数创建一个空列表`lst`,用于存储每个数字的字符形式。同时,函数定义一个布尔变量`is_positive`,用于表示整数的正负情况。如果输入的整数`int_value`小于0,说明它是一个负数,那么将`is_positive`设置为`False`,并将`int_value`取绝对值,以便后续处理。
while int_value:
number = int_value % 10
int_value //= 10
str_number = chr(number + 48)
lst.append(str_number)接下来是一个循环,用于将整数的每个位数提取出来并转换为字符形式。循环条件是`int_value`不为0,即还有位数需要处理。在每次循环中,通过取整数`int_value`除以10的余数,可以得到当前位的数字。然后,将`int_value`整除以10,以便处理下一位。将数字转换为字符的过程使用了`chr()`函数,其中`number + 48`将数字转换为对应的ASCII码。将字符添加到列表`lst`中。
if not is_positive:
lst.append('-')
lst = lst[::-1]
return ''.join(lst)在循环结束后,检查整数的正负情况。如果输入的整数为负数,即`is_positive`为`False`,那么在最终的字符串前添加一个负号`'-'`。然后,将列表`lst`进行反转操作,以便得到正确的数字顺序。最后,使用`''.join(lst)`将列表中的字符连接成一个字符串,并将其作为函数的返回值。
总体来说,这段代码的作用是将整数转换为字符串形式。它通过不断地取整数的每个位数,并将每个位数的字符形式存储在列表中,最后将列表中的字符连接起来,得到整数的字符串表示。
思路:
int类型的数据,不能像字符串那样使用for循环进行遍历,但可以结合/和%操作符从各位向高位进行遍历,获取到某一位的数字之后,将其转换成字符串append到一个列表中。
遍历结束后,翻转列表,用空字符串join这个列表,即可得到转换后的字符串。
单个数字,怎样转换成字符串?可以使用3.6中类似的方法, 创建一个字典,数字为key,字符串数字为value
int_str_dict = { 0: '0', 1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8', 9: '9', }
获得某一位数字之后,通过字典获得对应的字符串,此外,还可以通过ASCII码来获得与之对应的数字字符。以3为例,chr(3+48)即可得到字符串“3”,其原理,字符串3的ASCII码表十进制数值为51,恰好比3大48,其他数值,也同样如此。
细节性问题:
①如果传入的参数是0,那么直接返回字符串‘0’
②如果传入的参数是负数,那么需要标识记录,最后在列表里append一个‘-’字符串
③lst=[1,2,3], 反转 lst=lst[::-1]
为了降低难度,只要求将字符串转换成float类型的数据,并且字符串都是符合”xx.xx”类型的字符串,例如“34.22”
def my_float(string):
"""
将字符串string转换成float类型数据
:param string:
:return:
"""
pass
代码:
str_int_dic = { '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def my_float(string):
arrs = string.split('.')
int_value = my_int(arrs[0]) #整数部分
float_value = my_int(arrs[1]) #小数部分
while float_value > 1:
float_value *= 0.1
return int_value + float_value
思路:
使用split函数,可以以"."作为分隔符,可以将字符串分割为两部分,整数部分和小数部分,以"34.22"为例,分别得到整数34和22,对于22,不停的乘以0.1,直到它的数值小于1,就得到了小数部分
内置函数len可以获得可迭代对象的长度,例如字符串、列表、元组、集合。实现一个类似功能的函数,获得数据的长度。
def my_len(obj):
"""
获得obj对象的⻓度
:param obj:
:return:
"""
pass
代码:
from collections import Iterable
def my_len(obj):
if not isinstance(obj, Iterable):
return None
length = 0
for item in obj:
length += 1
return length
思路:
使用for循环遍历对象,循环的次数就是这个对象的长度,只需要一个变量来保存循环的次数就可以了。
对obj参数的检查,可以使用isinstance判断是否为列表、元组、字典、集合、字符串中的某一个,更为简便的做法就是,这些对象都是可迭代对象,isinstance(obj,lterable)可以判断obj是否为可迭代对象