Python150题day16

3.5 int

内置函数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再加上所遍历的数值,这样就巧妙地解决了位数问题。

3.6 str

内置函数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]

3.7 float

为了降低难度,只要求将字符串转换成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"为例,分别得到整数3422,对于22,不停的乘以0.1,直到它的数值小于1,就得到了小数部分

3.8 len

内置函数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是否为可迭代对象

你可能感兴趣的:(Python150题,python)