一、函数与过程

1、Python只有函数没有过程

>>> def hello():
    print('Hello  fishC!')
>>> temp = hello()
Hello  fishC!
>>> temp
>>> type(temp)
<class 'NoneType'>
>>>

解释:hello赋值给temp,单独temp返回的值是none

2、python可以返回多个值

>>> def back():
    return [1,'尘封',3.14]

>>> back()
[1, '尘封', 3.14]
>>> def back():
    return 1,'尘封',3.14
---利用列表,返回多个值
>>> back()
(1, '尘封', 3.14)
---利用元组返回多个值

二、局部变量和全局变量

局部变量:local Variable  全局变量:Global Variable

函数内的参数以及变量叫局部变量,函数外的变量是全局变量并且函数外无法访问局部变量

1、函数外调用局部变量

def discounts(price,rate):
    fina_price = price * rate #局部变量
    return fina_price

old_price = float(input('请输入原价:'))
rate = float(input('请输入折扣率:'))
new_price = discounts(old_price,rate)
price('打折后价格是:',new_price)
print('函数外打印局部变量final_price的值:',final_price)  #函数外调用局部变量final_price

================= RESTART: /Users/wufq/Desktop/全局变量&局部变量.py =================
请输入原价:100
请输入折扣率:0.8
Traceback (most recent call last):
  File "/Users/wufq/Desktop/全局变量&局部变量.py", line 8, in <module>
    price('打折后价格是:',new_price)
NameError: name 'price' is not defined

为什么报错呢?原因:函数外是无法访问局部变量的

2、函数内调用全局变量

def discounts(price,rate):
    fina_price = price * rate #局部变量
    old_price = 50
    print('修改后的old_price1:',old_price)
    return fina_price

# old_price,rate,new_price都是全局变量,作用域在整个文件,整个模块
old_price = float(input('请输入原价:'))
rate = float(input('请输入折扣率:'))
new_price = discounts(old_price,rate)
print('修改前的old_price2:',old_price)
print('打折后价格是:',new_price)

================= RESTART: /Users/wufq/Desktop/全局变量&局部变量.py =================
请输入原价:100
请输入折扣率:0.8
修改后的old_price1: 50
修改前的old_price2: 100.0
打折后价格是: 80.0
>>>

解释:
1、由打印出的内容可以看出结果还是按照未修改前的变量值进行的
2、函数内修改全局变量old_price,会生成一个新的局部变量,但是名字和全部变量是一样的,强烈要求禁止在函数内定义一个变量名字
和全局变量名字一样的局部变量

三、练习题

1、编写一个函数,判断传入的字符串参数是否为“回文联”(回文联即用回文形式写成的对联,即可顺读,也可倒读。例如:上海自来水来自海上)

思路:

A、确定输入字符串的长度,最后一位,判断中间位置,标志位

B、对比第一位和最后一位,并且最后为对比后递减

def palindrome(string):
    length = len(string) #获取输入string的长度
    last = length -1  #序列是从索引0开始计数,找到最后一个字符的索引,即:下标
    length //=2 #地板除,取string长度的一半,以便后面的for循环前后一半字符串的对比
    flag = 1 #标记位,始终为1即为回文联

for each in range(length): #理解难点,通过for循环进行元素的一一对比,each分别取0,1,2,3
        if string[each]!= string[last]: #前后一个一个的对比
            flag =0  #如果不一样,则置flag = 0 ,即:非回联文
            
        last -=1 #对比完一组以后,进行递减对比第二组

#通过flag是否等于1,来判断是不是回联文
    if flag ==1:
        return 1
    else:
        return 0

String = input('请输入一句话:')
if palindrome(string) ==1:
    print("是回联文")
else:
    print("不是回联文")

2、python实现反转字符串的集中方法

将 string = "abcdef"反转成“fedcba”

string = "abcdef"

#第一种:使用字符串切片
def string_reverse1(string):
    return string[::-1]

print("string_reverse1=",string_reverse1(string))

#第二种:使用reversed()函数
def string_reverse2(string):
    return  ''.join(reversed(string))

#join()函数:将序列中的元素以指定的字符连接生成一个新的字符串

print("string_reverse2=",string_reverse2(string))

#第三种:交换前后字母的位置
def string_reverse3(string):
    t=list(string)
    l = len(t)

#zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象
    #如果各个迭代对象的元素个数不一致,则返回的对象长度与最短的可迭代对象相同
    #利用*号操作符,与zip相反,进行解压
    for i,j in zip(range(l-1,0,-1),range(l//2)):
        t[i],t[j]=t[j],t[i]

return ''.join(t)

print("string_reverse3=",string_reverse3(string))

'''for 循环是个难点,一点一点来解析:
1、列出list(range(l-1,0,-1)),打印的结果是:[5, 4, 3, 2, 1]    这里的l=6
2、列出list(range(l//2)),打印的结果是:[0, 1, 2]
3、zip(range(l-1,0,-1),range(l//2)),打印的结果:[(5, 0), (4, 1), (3, 2)]
4、t[i],t[j]=t[j],t[i],是把元组里面的内容交换成[(0, 5), (1, 4), (2, 3)]
5、采用join(t),是把元组内的字符重新连接成一个新的字符串,即进行了交换,变成了:fedcba'''

#第四种:递归的方式,每次输出一个字符
def string_reverse4(string):
    if len(string) <= 1:
        return string
    return string_reverse4(string[1:])+string[0]

print("string_reverse4=",string_reverse4(string))
    
#第五种:使用for循环,从左至右输出
def string_reverse5(string):  
    #return ''.join(string[len(string) - i] for i in range(1, len(string)+1))  
    return ''.join(string[i] for i in range(len(string)-1, -1, -1))
print("string_reverse5=",string_reverse5(string))

3、编写一个函数,分别统计出传入字符串参数的英文字母,空格,数字和其他字符的个数
--Python有4种传值得方式,必选参数fun(param),默认传参fun(param=value),关键字参数fun(**param),可变参数fun(*param)
#1、必选参数 fun(param)
#定义函数时参数个数,顺序已定义好,在调用函数时,参数个数,顺序必须一致,不能多也不能少也不能乱

def test(param1,param2,param3):
    print (param1,param2,param3)

test(1,'hello','尘封')
test('hello',1,'尘封')

'''执行结果:
1 hello 尘封
hello 1 尘封'''
print('*************************')
#2、默认参数 fun(param=value)
#a、定义函数时,已经为参数传入一个默认值,调用函数时不重新传参,则参数已默认值显示
#b、如果必选参数和默认参数同样存在时,则默认参数必然跟在必选参数后面
#c、如果有多个默认参数,调用顺序可以不一致,但是必须要显示表明是哪个默认参数,但是建议按照函数定义的统一顺序进行使用

def fun(param1,param2 = 100,param3= True):
    print(param1,param2,param3)

fun(1)
fun(1,200) #默认参数在必选参数后面
fun(1,param3=False,param2=300)#调用顺序也可以不一致

'''执行结果:
1 100 True
1 200 True
1 300 False'''

print('*************************')
#3、可选参数 fun(*param)
#a、定义函数时,当传入的参数个数不确定,可能是0个,1个, 2个。。。多个时,则可选用可选参数表示,书写格式为参数名称前加一个*号
#b、可选参数在调用时的形式是以一个tuple元组形式存在,即param是一个元组
#c、定义了一个可选参数时,可以把一个列表或者元组作为一个参数进行传递,只需要在传递的时候在前面加上*号
#d、当有必选参数,默认参数,可选参数时,必须按照必选,默认,可选参数进行定义

def fun(param1,param2=100,*param3):

def fun1():
        print(param1,param2)

def fun2():
        print(param1,param2,param3,type(param3))

fun2() if len(param3)!=0 else fun1()

fun(1,2,3,4,5,6)#验证可选函数在调用时是已一个tuple元组形式存在
li =[1,2,3]
ti=(1,2,3)
fun(1,2,*li)#验证传入的可变参数是一个列表
fun(1,2,*ti)#验证 传入的可变参数是一个元组
fun(1,2)

'''执行结果:
1 2 (3, 4, 5, 6) <class 'tuple'>
1 2 (1, 2, 3) <class 'tuple'>
1 2 (1, 2, 3) <class 'tuple'>
1 2'''

print('*************************')
#4、关键字参数fun(**param)
#a、定义函数时,当传入的参数个数不确定时,也可选用关键字参数,与可选参数的区别在于:必须使用默认参数的形式进行传参,例如:param1=1,param2 =2
#b、关键字参数在调用时的形式是以一个dict字典形式存在,即param
#c、定义了一个关键字参数时,可以把一个列表作为一个整体进行传递,只需要在传递的时候在前面加上**
#d、当有必选参数,默认参数,可选参数,关键字参数时,必须按照必选,默认,可选,关键字参数进行定义

def fun(param1,param2=100,*param3,**param4):

def fun1():
        print (param1,param2)

def fun2():
        print (param1,param2,param3,param4,type(param4))

fun2() if len(param3)!=0 and len(param4)!=0 else fun1()

fun(1,2,3,4,a=5,b=6,c=7)#验证可选函数在调用时是已一个tuple元组形式存在,关键字函数在调用时已一个字典的形式存在
dict= {"a":1,"b":2,"c":3}
fun(1,2,3,4,**dict) #传入的可变参数是一个字典dict
fun(1,2)

#需求:编写一个函数,分别统计出传入的字符串参数的英文字母,空格,数字和其他字符的个数

def count(*param):#可选参数
    length = len(param) #获取传入参数的长度

for i in range(length):

#给英文字母,空格,数字和其他一个初始值
        letter = 0
        space = 0
        digit = 0
        others = 0

#在参数内进行循环判断
        for each in param[i]:
            if each.isalpha():
                letter +=1
            elif each.isspace():
                space +=1
            elif each.isdigit():
                digit +=1
            else:
                others +=1

print('第 %d 个字符串共有:英文字母 %d个,空格 %d个,数字 %d个,其他字符 %d个' %(i+1,letter,space,digit,others))

count('i love www.yizhibo.com/666','i love you','you love me')

'''执行结果:
第 1 个字符串共有:英文字母 18个,空格 2个,数字 3个,其他字符 3个
第 2 个字符串共有:英文字母 8个,空格 2个,数字 0个,其他字符 0个
第 3 个字符串共有:英文字母 9个,空格 2个,数字 0个,其他字符 0个
'''

【Python019--函数与过程】的更多相关文章

  1. PL/SQL --> 动态SQL调用包中函数或过程

    动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...

  2. .Net程序员学用Oracle系列(7):视图、函数、过程、包

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.视图 1.1.创建视图 2.函数 2.1.创建函数 2.2.调用函数 3.过程 3.1.创建过程 3.2.调用过程 4.包 ...

  3. 变量、&连接、函数与过程、按下某键

    1.变量的声明 常量 信息 为 文本型 = "你好,世界!" '这是常量 变量 结果 为 整数型 '这是程序集变量,在程序集的开头定义即可 变量 测试 为 整数型 = '可以直接给 ...

  4. mysql自定义函数与过程中写法的注意事项

    BEGIN #Routine body goes here... /* update szzx_goods_common set gc_id=i where gc_name=(SELECT gc_na ...

  5. 【Oracle】Oracle自定义的函数与过程

    本篇主要内容如下: 6.1 引言 6.2 创建函数 6.3 存储过程 6.3.1创建过程 6.3.2调用存储过程 6.3.3 AUTHID 6.3.4 PRAGMA AUTONOMOUS_TRANSA ...

  6. oracle中使用函数控制过程是否执行(结合job使用)

    oracle中使用函数控制过程是否执行(结合job使用时候,循环时间不好写的时候,可以此种方法比较方便) CREATE OR REPLACE FUNCTION wsbs_pk_date_validat ...

  7. MySql创建函数与过程,触发器, shell脚本与sql的相互调用。

    一:函数 1:创建数据库和表deptartment, mysql> use DBSC; Database changed mysql), ), )); Query OK, rows affect ...

  8. oracle数据库之存储函数和过程

    一.引言     ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数.过程和函数统称为 PL/SQL 子程序,他们是被命名的 PL/SQL 块 ...

  9. JS,Javascript加载与函数执行过程

    Js,Javascript加载与函数执行过程 test.html <!DOCTYPE HTML> <html lang="en"> <head> ...

  10. JS Foo.getName笔试题解析,杂谈静态属性与实例属性,变量提升,this指向,new一个函数的过程

     壹 ❀ 引 Foo.getName算是一道比较老的面试题了,大致百度了一下在17年就有相关文章在介绍它,遗憾的是我在19年才遇到,比较奇妙的是现在仍有公司会使用这道题.相关解析网上是有的,这里我站在 ...

随机推荐

  1. sift拟合详解

    1999年由David Lowe首先发表于计算机视觉国际会议(International Conference on Computer Vision,ICCV),2004年再次经David Lowe整 ...

  2. Sift中尺度空间、高斯金字塔、差分金字塔(DOG金字塔)、图像金字塔

    转自:https://blog.csdn.net/dcrmg/article/details/52561656 一. 图像金字塔 图像金字塔是一种以多分辨率来解释图像的结构,通过对原始图像进行多尺度像 ...

  3. 理解tcp顺序释放操作和tcp的半关闭

    Shutdown的调用        在关闭socket的时候,可以有两种方式closesocket和shutdown,这两个函数的区别在什么地方呢? #include <sys/socket. ...

  4. Vuejs核心思想学习笔记

    习Vue已经有一段时间了,但未对其核心思想作自己的总结和理解 Vue核心思想有两个 : 数据驱动和组件化(系统组件) 数据驱动 数据驱动目的是让数据和DOM保持同步, 只要修改了data数据,DOM就 ...

  5. jQuery常用的取值或赋值的方法

    $(selector).data(name) 从被取元素返回附加的数据 存在一个div标签:<div data-meeting="hi Tom"></div> ...

  6. tp连贯操作

    链接数据库 首先写配置文件 复制concentration.php中的 /* 数据库设置 */ 'DB_TYPE' => '', // 数据库类型 'DB_HOST' => '', // ...

  7. CNN超参数优化和可视化技巧详解

    https://zhuanlan.zhihu.com/p/27905191 在深度学习中,有许多不同的深度网络结构,包括卷积神经网络(CNN或convnet).长短期记忆网络(LSTM)和生成对抗网络 ...

  8. java三大工厂结果总览

    2018-11-02 21:27:18 开始写 谢谢.Thank you.Salamat Do(撒拉玛特朵).あリがCám o*n(嘉蒙)とゥ(阿里嘎都).감사합니다 (勘三哈咪瘩).terima K ...

  9. caffe生成voc格式lmdb

    要训练ssd基本都是在liu wei框架下改,生成lmdb这一关照葫芦画瓢总遇坑,记录之: 1. labelmap_voc.prototxt要根据自己的分类修改,比如人脸检测改成这样: item { ...

  10. jsp页面报错 javax.servlet cannot be resolved to a type

    需要引入 Tomcat 中的两个 jar 包: servlet-api jsp-api.jar