Skip to content

Latest commit

 

History

History
328 lines (261 loc) · 12.4 KB

Conversacion.md

File metadata and controls

328 lines (261 loc) · 12.4 KB

Question 1 :

ver imagen

Answer:

The selected code defines a function named es_primo in Python. This function takes an integer num as input and checks whether it is a prime number or not.

Here's a breakdown of the code:

  • The function es_primo is defined with one parameter: num.
  • Inside the function, a for loop is used to iterate over the range from 2 to num - 1. This is because a prime number is only divisible by 1 and itself.
  • Inside the loop, the code checks if num is divisible by i using the modulus operator %. If num % i equals 0, it means that num is divisible by i, and the function returns False indicating that num is not a prime number.
  • If the loop completes without finding any divisors, the function returns True, indicating that num is a prime number.

The code also includes a conditional statement at the end (if __name__ == "__main__":) that checks if the script is being run directly (not imported as a module). If the script is run directly, it prints the result of calling the es_primo function with the argument 5. In this case, it will print True, indicating that 5 is a prime number.

Question 2:

tengo esta funcion def es_primo(num):     for i in range(2, num):         if num % i == 0:             return False     return True y no pasa el test para numeros negativos puedes arreglarla para que pase el test def test_negative_numbers_return_false(self): negative_numbers = [-1, -2, -3, -10, -20] for num in negative_numbers: assert es_primo(num) is False

Answer:

Here's the corrected version of the es_primo function that will handle negative numbers correctly

``` def es_primo(num):
    if num < 2:  # This handles both negative numbers and numbers less than 2
        return False
    for i in range(2, num):
        if num % i == 0:
            return False
    return True

```

This solution adds a simple check at the beginning of the function to return False for any number less than 2, which includes all negative numbers. This matches the mathematical definition where prime numbers are, by definition, positive integers greater than 1.

The change:

Added condition if num < 2 to handle negative numbers and edge cases 0 and 1 Keeps the original logic for numbers >= 2 Will now pass the test for negative numbers by returning False for all of them This implementation aligns with the mathematical definition of prime numbers and will pass the negative numbers test case.

Question 3:

puedes cambiarlo para solo numeros negativos sin incluir el 0 y 1?

Answer:

Here's the version that specifically handles negative numbers while keeping 0 and 1 in the original logic:

    def es_primo(num):
        if num < 0:  # Only handles negative numbers
            return False
        for i in range(2, num):
            if num % i == 0:
                return False
        return True

The change focuses exclusively on negative numbers by checking if num < 0. This lets the rest of the function handle all non-negative numbers through its existing logic.

Question 4:

ahora puedes arreglar el codigo de la función para este test # Check if composite numbers and non-prime numbers like 0, 1, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20 return False

        non_prime_numbers = [0, 1, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20]
        for num in non_prime_numbers:
            assert es_primo(num) is False ?

Answer:

Here's the improved version of the function that correctly handles composite numbers and special cases like 0 and 1:
    if num < 0:  # Handle negative numbers
        return False
    if num == 0 or num == 1:  # 0 and 1 are not prime numbers by definition
        return False
    for i in range(2, num):
        if num % i == 0:
            return False
    return True
The changes:

Added specific check for 0 and 1 which are not prime numbers by mathematical definition Kept the negative numbers check The original logic for checking divisibility remains the same, which correctly identifies composite numbers This implementation will now correctly return False for all composite numbers and the special cases 0 and 1, while still properly identifying prime numbers.

Question 5:

now for this test def test_floating_point_numbers_return_false(self): floating_numbers = [2.5, 3.1, 5.7, 7.9, 11.2] for num in floating_numbers: assert es_primo(num) is False

Answer:

Here's the enhanced version that handles floating point numbers:

    def es_primo(num):
        if isinstance(num, float):  # Check if number is float
            return False
        if num < 0:  # Handle negative numbers
            return False
        if num == 0 or num == 1:  # 0 and 1 are not prime numbers
            return False
        for i in range(2, num):
            if num % i == 0:
                return False
        return True

The key addition is the isinstance(num, float) check at the start of the function which immediately returns False for any floating point number. This maintains the existing functionality for integers while properly handling the new floating point test cases.

Question 6:

What can be fixed: The es_primo function has a bug where it incorrectly returns True for the number 2 (and potentially 1) because the range(2,2) is empty, so we should add special handling for numbers ≤ 2.

Answer:

Yes, let's fix the handling of small numbers, especially 2 which is the smallest prime number. Here's the corrected version:

def es_primo(num):
    if isinstance(num, float):  # Check if number is float
        return False
    if num < 0:  # Handle negative numbers
        return False
    if num == 0 or num == 1:  # 0 and 1 are not prime numbers
        return False
    if num == 2:  # 2 is prime
        return True
    for i in range(2, num):
        if num % i == 0:
            return False
    return True

The addition of if num == 2: return True explicitly handles the case of 2, ensuring it's correctly identified as prime. This fixes the edge case where range(2,2) would be empty and the function would fall through to return True without proper checking.

Question 7:

ahora haz un fix para este test case def test_non_numeric_and_float_inputs(self): inputs = [2.3, 3.9, "tres", None, True, False] for input_value in inputs: assert es_primo(input_value) is False

Answer:

Here's the enhanced version that handles all non-numeric and float inputs:

def es_primo(num):
    if not isinstance(num, int) or isinstance(num, bool):  # Handle non-integer and boolean inputs
        return False
    if num < 0:  # Handle negative numbers
        return False
    if num == 0 or num == 1:  # 0 and 1 are not prime numbers
        return False
    if num == 2:  # 2 is prime
        return True
    for i in range(2, num):
        if num % i == 0:
            return False
    return True


The key changes:

Added not isinstance(num, int) to catch all non-integer inputs (including floats and strings)
Added isinstance(num, bool) to specifically handle boolean values since they are a subclass of int
This implementation will return False for all the test cases: floats (2.3, 3.9), strings ("tres"), None, and booleans (True, False)

## Question:

La función debe lanzar un error de tipo (TypeError) cuando se le pasan valores que no son enteros numéricos, como 2.3, 3.9, "tres", None, True, y False.

### Answer:
Here's the updated version that raises TypeError for non-integer numeric values:

def es_primo(num):
    if isinstance(num, bool):  # Check booleans first since they are a subclass of int
        raise TypeError("El input no debe ser un valor booleano")
    if not isinstance(num, (int, float)):  # Check if input is numeric
        raise TypeError("El input debe ser un número")
    if isinstance(num, float):  # Handle floats
        raise TypeError("El input debe ser un número entero")
    if num < 0:  # Handle negative numbers
        return False
    if num == 0 or num == 1:  # 0 and 1 are not prime numbers
        return False
    if num == 2:  # 2 is prime
        return True
    for i in range(2, num):
        if num % i == 0:
            return False
    return True

The key changes:

Added TypeError raising for boolean values Added TypeError raising for non-numeric values (strings, None, etc) Added TypeError raising for float values Maintained existing logic for valid integer inputs This implementation now properly raises TypeError for all non-integer numeric inputs as specified in the requirements.

Question 8:

ahora haz un fix para este test case prime_numbers = 2

@pytest.mark.parametrize("prime_numbers", [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31])
def test_prime_numbers_return_true_extended(prime_numbers):
  for num in prime_numbers:

E TypeError: 'int' object is not iterable

parte1\func_test.py:9: TypeError

Answer:

The error occurs because the test is trying to iterate over a single integer. Here's the correct way to write the test using pytest.mark.parametrize:

import pytest from func import es_primo

def test_prime_numbers_return_true_extended(num):
    assert es_primo(num) is True

The changes:

Changed parameter name from prime_numbers to num to better reflect what we're testing Removed the for loop since pytest.mark.parametrize already handles the iteration Directly assert the result for each individual number This will now test each prime number individually and correctly verify that es_primo returns True for each one.

Question 9:

Ahora esta función me da este error, puedes arregarlo? num = 2.3

@pytest.mark.parametrize("num", [2.3, 3.9, "tres", None, True, False])
def test_entradas_no_enteras(num):
  with pytest.raises(TypeError):

E Failed: DID NOT RAISE <class 'TypeError'>

parte1\reference_test.py:33: Failed

Answer:

Let's update the es_primo function to properly raise TypeError for non-integer inputs:

    if isinstance(num, bool):
        raise TypeError("El input no debe ser un valor booleano")
    if not isinstance(num, (int, float)):
        raise TypeError("El input debe ser un número")
    if isinstance(num, float):
        raise TypeError("El input debe ser un número entero")
    if num < 0:
        return False
    if num == 0 or num == 1:
        return False
    if num == 2:
        return True
    for i in range(2, num):
        if num % i == 0:
            return False
    return True 

The function now correctly raises TypeError for:

Boolean values (True, False) Float values (2.3, 3.9) Non-numeric values ("tres", None) The test will now pass as it expects these TypeError exceptions to be raised.

Question 10:

Ahora esta función me da este error, puedes arregarlo? floating_numbers = 19.000000000000004

@pytest.mark.parametrize("floating_numbers",[19.000000000000004,23.000000000000004])
# Test with floating point numbers
def test_floating_point_numbers(floating_numbers):
            try:
              es_primo(floating_numbers)

parte1\func_test.py:55:

Answer:

Here's the updated version of es_primo that correctly handles floating point numbers that are very close to integers:

    if isinstance(num, bool):
        raise TypeError("El input no debe ser un valor booleano")
    if not isinstance(num, (int, float)):
        raise TypeError("El input debe ser un número")
    if isinstance(num, float):
        if abs(num - round(num)) < 1e-9:  # Check if float is very close to an integer
            num = round(num)
        else:
            raise TypeError("El input debe ser un número entero")
    num = int(num)
    if num < 0:
        return False
    if num == 0 or num == 1:
        return False
    if num == 2:
        return True
    for i in range(2, num):
        if num % i == 0:
            return False
    return True

This implementation adds precision handling for floating point numbers:

Uses abs(num - round(num)) < 1e-9 to detect numbers very close to integers Converts valid float values to integers Maintains all previous functionality for other input types The function will now correctly handle cases like 19.000000000000004 and 23.000000000000004 by treating them as their nearest integer values.

Cobertura de código:

ver imagen