Day10 - 字符串和函数

一、字符串格式化

1. 字符串内容不确定的解决方案
name = '小明'
age = 18
money = 23515.25

# xxx今年xx岁,月薪:xxx元
# 方案一:字符串拼接
message = name + '今年' + str(age) + '岁,月薪:' + str(money) + '元'
print(message)

# 方案二:字符串格式占位符
message = '%s今年%d岁,月薪:%f元' % (name, age, money)
print(message, type(message))

# 方案三:f-string
message = f'{name}今年{age}岁,月薪:{money}元'
print(message, type(message))
2. 字符串格式占位符
"""
语法:带有格式占位符的字符串 % (数据1, 数据2, ...)
注意:a.数据的个数和占位符的位置和个数要对应  b.当只有一个数据的时候()可以省略

%s  --  字符串占位符,可以对应任何能转换成字符串的数据
%d  --  整数占位符,可以对应任何数字数据(如果是浮点数,拼接的时候只拼接整数部分)
%f  --  浮点数占位符,%.Nf(保留N位小数),可以对应任何数字数据
%c  --  字符占位符,可以对应任何字符或者字符编码值
"""
print('x:%s y:%d z:%f m:%c' % ([10, 20], -12.89, 20, 0x4e00))
# x:[10, 20] y:-12 z:20.000000 m:一

print('%c love you' % 105)
3. 补充:r语法
# Python可以在字符串的最前面加r或者R,来让字符串中所有的转义字符的功能消失
str1 = r'\tbc\n123:你好'
print(str1)
4. f-string
1)直接提供数据:{提供数据的表达式}
"""
语法:在字符串的最前面加f或者F,就可以在字符串中通过{}来提供数据,{}中可以是任何有结果的表达式
"""
name = '小明'
str1 = f'x:{name}, y:{100}, z:{100 * 2 + 3}, m:{name * 2}, n:{name.replace("小", "xiao")}'
print(str1)
name = 'Jay'
saying = '唉哟,不错哟!'
str1 = f'{name}:{saying}'
print(str1)
2)添加参数:{提供数据的表达式:参数}
"""
a. .Nf -- 保留N位小数
b. , -- 用逗号将数据三位三位分开
c. ,.Nf -- 使用逗号的同时保留N位小数
d. .N% -- 将小数转换成百分比,百分数保留N位小数,默认6位
e. X>N或者X<N -- X是填充字符(如果没有X表示用空格填充),N是长度;> - 填前面;< - 填后面
"""
money = 19852
str1 = f'月薪:{money:.2f}'
print(str1)         # 月薪:19852.00

num = 19800000000
print(f'数量为:{num:,}')           # 数量为:19,800,000,000
print(f'数量为:{num:,.2f}')        # 数量为:19,800,000,000.00

rate = 0.78
print(f'运动鞋的占比:{rate:.2%}')     # 运动鞋的占比:78.00%

num = 1
print(f'学号:Python2106{num:0>3}')        # 学号:Python2106001
print(f'学号:Python2106{num:0<3}')        # 学号:Python2106100

stu1 = '罗成'
stu2 = '程咬金'
print(f'姓名:{stu1:<10} 年龄:18')
print(f'姓名:{stu2:<10} 年龄:18')

salary = 19852.53
print(f'10月工资:{salary:,.0f}')
proportion = salary/1000000
print(f'工资占比:{proportion:.2%}')

二、字典推导式

"""
{键值对 for 变量 in 序列}
{键值对 for 变量 in 序列 if 条件语句}

dict(有且只有两个元素的小序列 for x in 序列)
dict(有且只有两个元素的小序列 for x in 序列 if 条件语句)
"""
dict1 = {x: x*2 for x in 'abc'}
print(dict1)        # {'a': 'aa', 'b': 'bb', 'c': 'cc'}

# 交换字典的键和值
dict2 = {'a': 10, 'b': 20, 'c': 30}
new_dict2 = {dict2[x]: x for x in dict2}
print(new_dict2)        # {10: 'a', 20: 'b', 30: 'c'}

new_dict2 = dict((dict2[x], x) for x in dict2)
print(new_dict2)

# 练习:已经一个字符串,将字符串转换成字典,键是字符串中的每个字符,值是字符对应的编码值
# 'abcA'  -> {'a': 97, 'b': 98, 'c': 99, 'A': 65}
str1 = 'abcA'
result = {x: ord(x) for x in str1}
print(result)       # {'a': 97, 'b': 98, 'c': 99, 'A': 65}

三、函数的作用

1. 如果没有函数,程序会遇到哪些问题
# 下载图片
# 打印: ====
# 下载图片
# 下载图片

# print('=================下载图片================')
# print('检测网络状态', '检查网络协议问题')
# print('连接图片服务器')
# print('传输图片数据')
# print('接收数据并且保存数据')
#
# print('====')
#
# print('=================下载图片================')
# print('检测网络状态', '检查网络协议问题')
# print('连接图片服务器')
# print('传输图片数据')
# print('接收数据并且保存数据')
#
# print('=================下载图片================')
# print('检测网络状态',  '检查网络协议问题')
# print('连接图片服务器')
# print('传输图片数据')
# print('接收数据并且保存数据')
2.函数
# 下载图片函数
def download():
    print('=================下载图片================')
    print('检测网络状态', '检测网络协议')
    print('连接图片服务器')
    print('传输图片数据')
    print('接收数据并且保存数据')


# 调用函数
download()
print('====')
download()
download()


# 求和问题
# # 1+2+3+4+...+100
# sum1 = 0
# for x in range(101):
#     sum1 += x
# print(sum1)
#
# # 1+2+3+...+50
# sum1 = 0
# for x in range(51):
#     sum1 += x
# print(sum1)
#
# # 1+2+3+...1000
# sum1 = 0
# for x in range(1001):
#     sum1 += x
# print(sum1)

# 求和问题函数
def sum_yt(num):
    sum1 = 0
    for x in range(num + 1):
        sum1 += x
    print(sum1)


# 调用函数
sum_yt(100)         # 5050
sum_yt(50)          # 1275
sum_yt(1000)        # 500500

# 系统函数max
nums = [10, 90, 23]
print(max(nums))        # 90

nums2 = [2, 9.0, 23, 5.1]
print(max(nums2))       # 23

四、认识函数

1. 函数的概念 ———— 机器
  • 函数就是实现某一特定功能的代码的封装
2. 函数的分类(按照函数由谁创建的)
"""
系统函数(别人造的机器)  --  Python自带的函数,程序员只需要在需要它们的功能的时候调用对应的函数
                          例如:print、input、type、max、min、sorted、sum、id、chr、ord等
自定义函数(自己造机器)  --  由程序员自己创建的函数,
"""
3. 定义函数(创建函数) – 造机器
"""
1)语法:
def 函数名(形参列表):
    函数说明文档
    函数体
    
2)说明
def  --  关键字;固定写法
函数名  --  由程序员自己命名
            要求:是标识符;不能是关键字
            规范:见名知义(根据函数名大概知道函数的功能是什么);字母都要小写,多个单词用下划线隔开;不使用系统函数名、类名或者模块名
()  --  固定写法
形参列表  --  以'变量名1, 变量名2, 变量名3, ...'的形式存在,其中每一个变量就是一个形参;形参可以有多个,也可以一个都没有
              形参的作用:将函数外部的数据传递到函数内部
              初学者怎么确定函数的形参:看实现函数的功能需不需要额外的数据,需要几个
函数说明文档  --  本质就是多行注释
函数体  --  和def保持一个缩进的一条或者多条语句(至少一条语句)
            函数体就是实现函数功能的代码段
"""


# 定义一个函数、求两个数的和
# def sum2(num1, num2):
#     """
#     功能说明区  --  描述函数的基本功能
#     :param num1: 参数说明区  --  描述每个形参传递的数据的功能或者意义
#     :param num2:
#     :return: 返回值说明区  --  功能的产物
#     """
#     pass


# 定义一个函数,获取一个字符串中中文的个数
# 正确写法:
def count_chinese_char1(str1):
    """获取字符串中中文的个数"""
    count = 0
    for x in str1:
        if '\u4e00' <= x <= '\u9fa5':
            count += 1
    print(f'中文个数:{count}')


count_chinese_char1('海上世界2342')     # 中文个数:4
count_chinese_char1('sjh23---')        # 中文个数:0


# 错误的写法:
# def count_chinese_str1(str1):
#     str1 = 'ssjshf是否会23数据是'
#     count = 0
#     for x in str1:
#         if '\u4e00' <= x <= '\u9fa5':
#             count += 1
#     print(f'中文个数:{count}')
#
#
# count_chinese_char1()


# 练习1:定义一个函数计算一个数的阶乘
# 5! = 1 * 2 * 3 * 4 * 5
def factorial(num):
    """
    求指定数的阶乘
    :param num: 要求阶乘的具体的数字
    :return: None
    """
    sum1 = 1
    for x in range(1, num+1):
        sum1 *= x
    print(sum1)


factorial(10)


# 练习2:定义一个函数,将两个字符串合并成一个字符串,合并方式如下:
# 'abc' 和 '123'  ->  'a1b2c3'
# 'abc' 和 '123456'  ->  'a1b2c3456'
# 'abcde' 和 '123'  -> 'a1b2c3de'
def merge_str(str1, str2):
    """将两个字符串合并成一个字符串"""
    new_str = ''
    # 先获取两个字符串较短的字符串的长度
    length = min(len(str1), len(str2))
    # 获取能对齐的部分交叉拼接
    for index in range(length):
        new_str += str1[index] + str2[index]
    # 获取并且拼接多出来的部分
    new_str += str1[length:] + str2[length:]
    print(new_str)


merge_str('abced', '223')


# 练习3:定义一个函数判断一个列表是否是数字列表(列表中的元素是否全是数字)
def is_number_list(list1):
    """判断列表是否是数字列表"""
    for x in list1:
        if type(x) not in (int, float):
            print('不是数字列表')
            break
    else:
        print('是数字列表')


is_number_list([10, 20, 30, 'man'])

五、函数的调用

  • 调用函数 – 使用机器
"""
定义函数的时候不会执行函数体,调用函数的时候才会执行函数体

语法:
函数名(实参列表)

说明:
函数名  --  需要哪个函数的功能就写哪个函数的名字;必须是已经定义好的函数的函数名
()  --  固定写法
实参列表  --  实参就是通过形参真正传递到函数内部的数据
              以'数据1, 数据2, 数据3,...'的形式存在
              
函数调用过程:
第一步:回到函数定义的位置,传参(用实参给形参赋值)
第二步:执行函数体
第三步:确定函数返回值
第四步:回到函数调用的位置,接着往后执行
"""


def func1():
    print('==========')
    print('++++++++')


func1()


def sum2(num1, num2):
    # num1 = 10, num2 = 20;  num1=110, num2 = 220; num1 = x = 10, num2 = y // 10 = 200 // 10 = 20
    print(num1 + num2)      # print(10+20); print(110 + 220); print(10 + 20)


print('开始')
sum2(10, 20)
sum2(110, 220)
x = 10
y = 200
sum2(x, y // 10)
print('结束')

六、返回值

"""
1)返回值的意义:返回值就是从函数内部传递到函数外部的数据
Python中每个函数都有且只有一个返回值(只有一个出口),通过这个出口传递的数据才是真正意义上的返回值
2)什么时候需要返回值
初学者:如果实现函数的功能产生了新的数据,就把新的数据通过返回值返回

3)怎么将函数内部的数据传递到函数外部(怎么返回)
将需要传递到函数外部的数据放在return关键字的后面;return后面的值就是函数的返回值,也是通过出口传递到外部的数据

4)怎么在函数外部获取函数返回值  --  获取函数返回值
获取函数调用表达式的值就是获取函数的返回值;函数返回值能做的事情函数调用表达式都能做
"""


def sum2(num1, num2):
    return num1 + num2


print(f'函数调用表达式:{sum2(10, 20)}')    # 函数调用表达式:30
print(f'函数调用表达式:{sum2(100, 2)}')    # 函数调用表达式:102

# 函数返回值能做的事情函数调用表达式都能做
sum2(10, 20)        # 30

x = 30
y = sum2(10, 20)
print(f'x:{x}, y:{y}')

x = 30 * 2 / 3
y = sum2(10, 20) * 2 / 3
print(f'x:{x}, y:{y}')

list1 = [30, sum2(10, 20)]
print(list1)

# 练习2:定义一个函数,将两个字符串合并成一个字符串,合并方式如下:
# 'abc' 和 '123'  ->  'a1b2c3'
# 'abc' 和 '123456'  ->  'a1b2c3456'
# 'abcde' 和 '123'  -> 'a1b2c3de'


def merge_str(str1, str2):
    length = min(len(str1), len(str2))
    new_str = ''
    for index in range(length):
        new_str += str1[index] + str2[index]
    new_str += str1[length:] + str2[length:]
    return new_str    # 'a1b2c3'


merge_str('abc', '123')     # 'a1b2c3'
print(merge_str('abc', '123'), type(merge_str('abc', '123')))
# a1b2c3 <class 'str'>

for x in merge_str('abc', '123'):
    print('x:', x)

print(merge_str('abc', '123').replace('a', 'A'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值